开发者问题收集

交替合并两个不同长度的数组,JavaScript

2019-07-02
2520

我想交替连接两个不同长度的数组。

const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const result = array1.reduce((arr, v, i) => arr.concat(v, array2[i]), []);

运行此代码时 结果, ['a', 1, 'b', 2, 'c', 3, 'd', 4]

我想要 ['a', 1, 'b', 2, 'c', 3, 'd', 4,5,6,7,8,9]

const array1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
const array2 = [1, 2, 3, 4];
const result = array1.reduce((arr, v, i) => arr.concat(v, array2[i]), []);

运行此代码时 结果, ['a', 1, 'b', 2, 'c', 3, 'd', 4,'e',undefined,'f',undefined,'g',undefined]

我想要 ['a', 1, 'b', 2、'c'、3、'd'、4、'e'、'f'、'g']

有两种情况。

如果数组 1 较短,则数组 2 中缺少某些值。

如果数组 1 较长,则合并后的数组之间会插入 undefined。

无论长度如何,如何交替合并两个数组?

当我使用 Swift 时,使用 zip2sequence 是一种简单的解决方案。 JavaScript 有类似的东西吗?

3个回答

使用 for 循环而不是 reduce ,这样就不会受到数组长度的限制。

const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const len = Math.max(array1.length, array2.length);
const result = [];
for (let i = 0; i < len; i++) {
  if (array1[i] !== undefined) {
    result.push(array1[i]);
  }
  if (array2[i] !== undefined) {
    result.push(array2[i]);
  }
}
console.log(result);
Barmar
2019-07-02

这是一个使用递归的解决方案

const interleave = ([x, ...xs], ys) =>
  x ? [x, ...interleave(ys, xs)] : ys
  
const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];

console.log(interleave(array1, array2))
console.log(interleave(array2, array1))
Chris Vouga
2019-07-02

您也可以使用 Array.reduce 来解决这个问题,只需先确定哪个数组是较长的数组即可:

const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];

let merge = (a,b) => {
  let short, long
  a.length > b.length ? (long=a, short=b) : (long=b, short=a)	
  return long.reduce((r,c,i) => {		
    short[i] ? r.push(short[i]) : 0
    return r.push(c) && r
  }, [])
}

console.log(merge(array1,array2))
console.log(merge(array2,array1))

只需一个 Array.forEach 的更简单的解决方案将是:

const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];

let merge = (a,b) => {
  let short, long, r=[]
  a.length > b.length ? (long=a, short=b) : (long=b, short=a)	
  long.forEach((x,i) => short[i] ? r.push(short[i], x) : r.push(x))
  return r
}

console.log(merge(array1,array2))
console.log(merge(array2,array1))

如果您要使用 lodash ,则将是这样的:

const array1 = ['a', 'b', 'c', 'd'];
const array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];

let merge = (a,b) => _.compact(_.flatten(_.zip(a,b)))

console.log(merge(array1,array2))
console.log(merge(array2,array1))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

使用 _.zip _.flatten _.compact

Akrion
2019-07-02