我有一个如下对象:
{
'4123': [
{ name: 'John', age: '29' }
],
'1514': [
{ name: 'Kelly', age: '25' }
]
}
所以:
{
'4123': [
{ name: 'Peter', age: '53' }
],
'567': [
{ name: 'Joost', age: '61' }
]
}
我使用Object.assign(json1, json2)
尝试实现我想要的效果,并得到以下结果:
{
'4123': [
{ name: 'Peter', age: '53' }
],
'567': [
{ name: 'Joost', age: '61' }
],
'1514': [
{ name: 'Kelly', age: '25' }
]
}
但我需要结果与此类似:
{
'4123': [
{ name: 'John', age: '29' },
{ name: 'Peter', age: '53' }
],
'567': [
{ name: 'Joost', age: '61' }
],
'1514': [
{ name: 'Kelly', age: '25' }
]
}
好像我几乎做对了。我认为它使用新合并的值重写属性值,而不是将其推送到数组。我怎样才能使它推送数组值?
答案 0 :(得分:0)
Object.assign
这里不是正确的工具(但是你可以看到你是如何到达那里的),因为你只是组合数组(将数组中的条目添加到另一个数组中),而不是合并对象按财产名称。
相反,遍历包含要合并到其他对象数组的数组的对象,并使用push
(修改其他对象的现有数组)或{{1 (生成一个新数组)来添加条目:
concat

const obj1 = {
'4123': [
{ name: 'John', age: '29' }
],
'1514': [
{ name: 'Kelly', age: '25' }
]
};
const obj2 = {
'4123': [
{ name: 'Peter', age: '53' }
],
'567': [
{ name: 'Joost', age: '61' }
]
};
// Object.keys returns an array of an object's string property names
for (const key of Object.keys(obj2)) {
// See if obj1 also has this
const other = obj1[key];
if (other) {
// Yes, append these entries to it
other.push(...obj2[key]);
}
}
console.log(obj1);

(如果.as-console-wrapper {
max-height: 100% !important;
}
个数组中的任何一个数组可能包含与相应的obj1
数组具有相同name
的条目,那么您将拥有决定如何处理冲突。)
您使用obj2
表示现代环境,但如果您需要支持仅限ES5的环境,我们只需使用Object.assign
代替var
,const
forEach
,for-of
代替传播符号,other.push.apply(other, obj2[key]);
函数而不是箭头函数。
答案 1 :(得分:0)
您可以使用reduce()
方法创建新函数,该方法将迭代第二个对象键并将其与第一个对象合并。
const obj1 = {"1514":[{"name":"Kelly","age":"25"}],"4123":[{"name":"John","age":"29"}]}
const obj2 = {"567":[{"name":"Joost","age":"61"}],"4123":[{"name":"Peter","age":"53"}]}
const merge = (o1, o2) => {
return Object.keys(o2).reduce(function(r, e) {
if (r[e]) r[e].push(...o2[e])
else r[e] = o2[e]
return r;
}, o1)
}
console.log(merge(obj1, obj2))