【问题标题】:Merge array value also with Object.assign将数组值也与 Object.assign 合并
【发布时间】:2018-01-30 15:05:52
【问题描述】:

我有一个像下面这样的对象:

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

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

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    Object.assign 在这里不是正确的工具(但可以看到您是如何到达那里的),因为您只是组合数组(将数组中的条目添加到另一个数组中),而不是按属性名称合并对象。

    相反,循环遍历包含要合并到其他对象数组中的数组的对象,并使用push(修改其他对象的现有数组)或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 的任何数组可能包含与对应obj2 数组具有相同name 的条目,则您必须决定如何处理冲突。)


    您使用Object.assign 暗示了一个现代环境,但如果您需要支持仅限ES5 的环境,我们只需使用var 而不是constforEach 而不是for-ofother.push.apply(other, obj2[key]);而不是扩展符号,以及 function 函数而不是箭头函数。

    【讨论】:

      【解决方案2】:

      您可以使用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))

      【讨论】:

        猜你喜欢
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多