使用Object.assign合并数组值

时间:2018-01-30 15:05:52

标签: javascript arrays json object

我有一个如下对象:

{
  '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' }
  ]
}

好像我几乎做对了。我认为它使用新合并的值重写属性值,而不是将其推送到数组。我怎样才能使它推送数组值?

2 个答案:

答案 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代替varconst forEachfor-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))