合并两个包含null和object元素的数组?

时间:2019-03-11 14:11:40

标签: javascript arrays ecmascript-6

如果我有两个JavaScript数组。

const a = [null,null,{a:1}];
const b = [{c:3},null,{a:3,b:2}];

我想要一个可以返回以下结果的函数。

[{c:3},null,{a:3,b:2}]

以上内容仍然适用于以下内容。

const a = [];
const b = [null,null,{t:4}];

我想得到以下结果。

[null,null,{t:4}]

有人可以帮助我吗?谢谢!

5 个答案:

答案 0 :(得分:3)

您似乎想合并那些在输入数组中具有相同索引的对象:

function merge(a, b) {
    const merged = [];
    for (let i = 0; i < a.length || i < b.length; i++) {
        merged.push(a[i] && b[i] ? {...a[i], ...b[i]} : a[i] || b[i]);
    }
    return merged;
}

console.log(merge([null,null,{a:1}], [{c:3},null,{a:3,b:2}]));
console.log(merge([], [null,null,{t:4}]));

答案 1 :(得分:2)

您也可以通过检查falsy值来合并项目。

const
    merge = (...a) => a.reduce(
        (r, a) => (a.forEach((o, i) => r[i] = o || r[i] || !r[i] && o), r),
        []
    );

console.log(merge([null, null, { a: 1 }], [{ c: 3 }, null, { a: 3, b: 2 }]));
console.log(merge([], [null, null, { t: 4 }]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

const a = [];
const b = [null,null,{t:4}];

const c = [...a, ...b];

console.log(c);

如何使用http://lavaan.ugent.be/tutorial/syntax2.html运算符?

您还可以像这样使用spread方法合并两个数组

const a = [];
const b = [null,null,{t:4}];

const c = a.concat(b);
console.log(c)

答案 3 :(得分:1)

Concat或Spread运算符应该执行此操作。

const a1 = [];
const b1 = [null,null,{t:4}];
const result1 = [...a1, ...b1];
console.log(result1);

const a2 = [null,null,{a:1}];
const b2 = [{c:3},null,{a:3,b:2}];
const result2 = [...a2, ...b2];
console.log(result2);

答案 4 :(得分:1)

我喜欢将处理分为两部分:

const zipWith = (fn) => (a, b) => [...Array(Math.max(a.length, b.length))]
  .map((_, i) => fn(a[i], b[i]))

const combine = zipWith ((a, b) => 
  a && b ? {...a, ...b} : a ? {...a} : b ? {...b} : null)

console.log(combine([null, null, {a: 1}], [{c: 3}, null, {a: 3, b: 2}]))
console.log(combine([], [null, null, {t: 4}]))
.as-console-wrapper { max-height: 100% !important; top: 0; }

zip”是一个函数的通用名称,该函数结合了两个数组,逐个索引。有时,“ zipWith”用于扩展名,该扩展名具有决定如何组合这两个值的功能。这个版本的zipWith比其他版本稍微复杂一点,因为它使用了两个输入数组的较长长度,而不仅仅是第一个输入数组的长度(可能写成zip = (fn) => (a1, a2) => a1.map((a, i) => fn(a, a2[i]))。)< / p>

combine使用处理四种情况的函数调用此函数:a null / b nulla null / b non-nulla non-null / b nulla non-null / b non-null,使用或组合提供的值。

zipWith是一个非常可重用的功能,您可能会在应用程序的其他地方发现有用的功能。 combine专门针对这种情况。