基于索引合并JavaScript数组而不使用.concat

时间:2018-04-19 03:43:41

标签: javascript arrays

我试图合并两个数组,大部分答案都与将第二个数组添加到第一个数组的末尾有关。我需要将索引合并到索引。

以下是示例代码:



let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3'];

Array.prototype.zip = function (arr) {
  return this.map(function (e, i) {
    return [ e, arr[i]];
  })
};
const arr3 = arr1.zip(arr2);
console.log(arr3);




结果应为:

['golf', 'player1', 'hockey', 'player2', 'tennis', 'player3']

上面的代码看起来应该可行,但不是。如果它可以修复,或交换更好,那就太好了.....

4 个答案:

答案 0 :(得分:3)

您可以使用.reduce()压缩两个数组:

let arr1 = ['golf', 'hockey', 'tennis'],
    arr2 = ['player1', 'player2', 'player3'];

let zip = (a1, a2) => a1.reduce((a, c, i) => (a.push(c, a2[i]), a), []);

console.log(zip(arr1, arr2));

<强>文档:

答案 1 :(得分:0)

.map将数组映射到另一个数组一对一:如果原始数组中有3个元素,.map只能生成另一个数组3个要素。如果您无法使用concat,请使用.reduce代替.map,这样您就可以在一次迭代中推送多个元素:

&#13;
&#13;
const arr1 = ['golf', 'hockey', 'tennis'];
const arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (otherArr) {
  return this.reduce((accum, item, i) => {
    accum.push(item);
    accum.push(otherArr[i]);
    return accum;
  }, []);
};
const arr3 = arr1.zip(arr2)
console.log(arr3)
&#13;
&#13;
&#13;

当然,最好不要更改内置的Array对象。您可以通过使用独立函数来轻松避免这种情况:

&#13;
&#13;
const arr1 = ['golf', 'hockey', 'tennis'];
const arr2 = ['player1', 'player2', 'player3']

function zip(arr1, arr2) {
  return arr1.reduce((accum, item, i) => {
    accum.push(item);
    accum.push(arr2[i]);
    return accum;
  }, []);
};
const arr3 = zip(arr1, arr2);
console.log(arr3);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用临时数组而不是直接输入法。

let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (arr) {
    this.map(function (e, i) { this.splice(i*2+1, 0, arr[i]); }, this )
};
const arr3 = arr1.zip(arr2)
console.log(arr3)

答案 3 :(得分:0)

一个简单的修复: 只需使用简单的reduce()来展平你现在所拥有的东西:

let arr1 = ['golf', 'hockey', 'tennis'];
let arr2 = ['player1', 'player2', 'player3']

Array.prototype.zip = function (arr) {
      return this.map(function (e, i) {
          return [ e, arr[i]]
      }).reduce((a,b)=>a.concat(b)); // blink and you miss the change...
    };
const arr3 = arr1.zip(arr2)
console.log(arr3)

这种方法可以保留你所拥有的,并且不会增加很多复杂性,如额外的方法调用,临时数组等;这是功能性方法的美妙之处:你是一个远离你需要的链条。我也会将它转换为一种独立的方法,而不是修改原型,但是除了这一点......