我想交替连接两个不同长度的数组。
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
是否有相似之处?
答案 0 :(得分: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);
答案 1 :(得分:0)
您还可以使用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>
答案 2 :(得分:0)
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))