如何在Javascript中合并这个例子中的两个数组?

时间:2018-06-04 12:37:02

标签: javascript

有两个数组,第一个有三个元素,第二个有十二个,如下:

array_foo = ['a','b','c'];
array_bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

我想合并它们,并将a放在4后面,将b放在8后面,将c放在12后面,是:

array_result=['1','2','3','4','a','5','6','7','8','b','9','10','11','12','c'];

如何使用Javascript进行操作?

更新

我不确定下面是好的,还有更好的答案吗?

array_bar.forEach((item, index) => {
    let array_foo_first = array_foo.slice(0, 4 * (index + 1) + index);
    let array_foo_last = array_foo.slice(4 * (index + 1) + index);
    array_foo = [
        ...array_foo_first,
        item,
        ...array_foo_last
    ]
});

3 个答案:

答案 0 :(得分:1)

我觉得相当简单,你只需要扩展一个for循环:



array_foo=['a','b','c'];
array_bar=['1','2','3','4','5','6','7','8','9','10','11','12'];


for (let i = 4,j=0; i<array_bar.length; i+=4,j++) {
  array_bar.splice(i+j, 0, array_foo[j]);
}

array_bar = array_bar.join();

console.log(array_bar);
&#13;
&#13;
&#13;

循环的快速解释:

您不仅要拥有一个索引,而是跟踪i的两个array_barj的{​​{1}}。您每次将array_foo增加4,并i增加1,因为您希望它们像这样(4:1)间隔开。

i

for (let i = 4,j=0; i<array_bar.length; i+=4,j++) 让我们在给定的位置插入一个元素,在这里我们在splice插入元素i+j4+0和{{1 },总是来自8+1的4个元素

12+2

答案 1 :(得分:0)

如果模式由array_foo的4 array_bar 1表示。 然后我会做一个小循环来完成它。

此循环基于array_bar

希望这会有所帮助:&gt;

&#13;
&#13;
var array_foo=['a','b','c'];
var array_bar=['1','2','3','4','5','6','7','8','9','10','11','12'];
var array_new = [];

array_bar.forEach((el,i)=>{
  if((i)%4==0 && i!=0)
    array_new.push(array_foo[(i/4)-1])
  array_new.push(el);
})
array_new.push(array_foo[array_foo.length-1]);

console.log(array_new)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

使用.forEach()

您可以循环遍历foo数组,并为每个元素连接bar的4个元素块与当前元素foo,然后将结果连接到包含res的{​​{1}}所有以前的块。

&#13;
&#13;
foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [];
foo.forEach((e,i) => { res = res.concat(bar.slice(4*i,4*i+4)).concat(e) } );

console.log(res)
&#13;
&#13;
&#13;

使用.map()

我们可以使用.map取代相同的结果:

[].concat.apply([], foo.map((e,i) => bar.slice(4*i,4*i+4).concat(e)))

所以我在这里映射foo如下:

foo[i] <- [bar[4*i], bar[4*i+1], bar[4*i+2], bar[4*i+3], foo[i]] (pseudocode!)

然后我将所有数组连接成一个:[].concat.apply([], arrayOfArrays)

&#13;
&#13;
foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [].concat.apply([], foo.map((e,i) => bar.slice(4*i,4*i+4).concat(e)));

console.log(res)
&#13;
&#13;
&#13;

不使用.concat

.concat方法(在前两个版本中使用)创建一个新数组。如果您正在寻找仍使用.map的其他解决方案,请点击此处:

foo.map((e,i) => res.push(...bar.slice(i*4, i*4+4), foo[i]));

我们不是连接数组,而是为bar的每个元素推送foo个元素,其元素为foo。我还使用destructuring assignment语法将块解包到传递给.push的参数中。

&#13;
&#13;
foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [];
foo.map((e,i) => res.push(...bar.slice(i*4, i*4+4), foo[i]));

console.log(res)
&#13;
&#13;
&#13;