我想将一个数组与另一个数组合并。唯一的问题是每个数组都在一个对象中。
直觉上我尝试了 {...arrObj, ...newArrObj}
但这会导致 newArrObj
覆盖 arrObj
中的项目。
const array = ['an', 'array'];
const newArray = [, , 'new', 'ehrray'];
const obj = {
key: { ...array
}
};
const newObj = {
key: { ...newArray
}
};
const merged = { ...obj,
...newObj
};
console.log(merged);
我希望 merged
是:
{
"key": {
"0": "an",
"1": "array",
"2": "new",
"3": "ehrray"
}
}
但是收到
{
"key": {
"2": "new",
"3": "ehrray"
}
}
答案 0 :(得分:0)
这可能有用
const a0 = ['1', '2', undefined , undefined, '5', '6', '7'];
const a1 = [undefined, undefined, '3', '4'];
function merge(a, b) {
return a.map(function(v,i){ return v?v:b[i]});
}
console.log(a0 > a1?merge(a0, a1):merge(a1, a0));
答案 1 :(得分:0)
我想更新一下,我最终使用 recursive merge 来合并包含数组的嵌套对象。
const array = ['an', 'array'];
const newArray = [, , 'new', 'ehrray'];
const obj = {
key: { ...array
}
};
const newObj = {
key: { ...newArray
}
};
const merge = (obj1, obj2) => {
const recursiveMerge = (obj, entries) => {
for (const [key, value] of entries) {
if (typeof value === "object") {
obj[key] = obj[key] ? { ...obj[key]
} : {};
recursiveMerge(obj[key], Object.entries(value))
} else {
obj[key] = value;
}
}
return obj;
}
return recursiveMerge(obj1, Object.entries(obj2))
}
console.log(merge(obj, newObj));
答案 2 :(得分:-1)
这个想法是只有少数设置有未设置的值。例如。 const newArray = new Array(4); newArray[2] = 'new'
;
{ value: null }
,甚至 { value: undefined }
与完全没有 { foo: 42 }
的 value
也不是一回事。这就是在您的示例中 "an"
和 "array"
被 null
中的 newArray
覆盖的原因。
您可以通过交换将数组添加到结果的顺序来解决这个特定示例,但是只要两个数组都包含 null
-values,就无法使用 spread-syntax / { {1}} 单独。你必须实现行为:
Object.assign