在数组元素之间插入对象的最优雅方法是什么?

cim*_*mak 13 javascript arrays

我确信有很多方法可以实现这一目标,但我正在寻找"优雅"的东西.

a = [
  'a',
  'b',
  'c'
];

magicArrayJoin(a, {value: 255} ); // insert the same object between each item

result ==  [
  'a',
  {value: 255},
  'b',
  {value: 255}
  'c'
];
Run Code Online (Sandbox Code Playgroud)

欢迎所有提案.:)

Jas*_* Tu 16

使用普通 ES6 的单行:

const interleave = (arr, thing) => [].concat(...arr.map(n => [n, thing])).slice(0, -1)
Run Code Online (Sandbox Code Playgroud)

用法:

interleave(['foo', 'bar', 'baz'], 'avocado')
Run Code Online (Sandbox Code Playgroud)

印刷:

> ["foo", "avocado", "bar", "avocado", "baz"]
Run Code Online (Sandbox Code Playgroud)

  • 不错的技术 - 现在可能只是 `const interleave = (arr, x) => arr.flatMap(e => [e, x]).slice(0, -1)` (7认同)

Epe*_*eli 13

你可以用flatMap来做.它可以从发现lodash例如

_.flatMap([1,2,3,4], (value, index, array) =>
     array.length -1 !== index // check for the last item
     ? [value, "s"]
     : value
);
Run Code Online (Sandbox Code Playgroud)

.OUPUTS

[1, "s", 2, "s", 3, "s", 4]
Run Code Online (Sandbox Code Playgroud)

更新

Array#flatMap 提案正在开发中,所以将来这应该有效:

[1, 2, 3, 4].flatMap(
    (value, index, array) =>
        array.length - 1 !== index // check for the last item
            ? [value, "s"]
            : value,
);
Run Code Online (Sandbox Code Playgroud)

  • 有点惊讶没有更有效的内置 lodash 函数 (2认同)

Zla*_*ang 12

使用ES6的flatMap函数。

const insertBetween = (ele, array) => {
  return array.flatMap((x) => [ele, x]).slice(1);
};

insertBetween('+', [1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)


mic*_*nic 10

在我看来,最优雅的方法是这样做:

ES6语法版本

const insertIntoArray = (arr, value) => {

    return arr.reduce((result, element, index, array) => {

        result.push(element);

        if (index < array.length - 1) {
            result.push(value);
        }

        return result;
    }, []);
};
Run Code Online (Sandbox Code Playgroud)

用法:

insertIntoArray([1, 2, 3], 'x'); // => [1, 'x', 2, 'x', 3]
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 6

一个普通的循环似乎是最好的:

function intersperse(arr, el) {
    var res = [], i=0;
    if (i < arr.length)
        res.push(arr[i++]);
    while (i < arr.length)
        res.push(el, arr[i++]);
    return res;
}
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找优雅的东西,它可能必须使用某种concatMap,如在

function concatMap(arr, fn) { return [].concat.apply([], arr.map(fn)); }
function intersperse(arr, el) { return concatMap(arr, x => [el, x]).slice(1); }
Run Code Online (Sandbox Code Playgroud)


小智 0

这对我有用:

 a.map(val => [val, {value: 255}]).flat()
Run Code Online (Sandbox Code Playgroud)