【问题标题】:Add a Property to Each Object in an Array Based on a Value Matching a Property of an Object in a Different Array根据与不同数组中对象的属性匹配的值,为数组中的每个对象添加属性
【发布时间】:2020-07-10 23:26:32
【问题描述】:

我有两个对象数组:

const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];

const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];

arr1 将始终包含与arr2 相同数量的对象,并且key 属性将始终保持一致,例如在上面的示例中,键 '12', '9', '4', '2' 出现在两个数组中。

我正在寻找一种有效的方法,将arr1 中每个对象的name 属性添加到arr2 中key 属性具有相同值的对象中。以上是一个简化的示例,在我的用例中,两个数组都可能包含 300 多个对象。

预期结果:

arr3 = [ {key: '12', age: '29', gender: 'm', name: 'john'}, {key: '9', age: '43', gender: 'm', name: 'steve'}, {key: '4', age: '19', gender: 'm', name: 'harry'}, {key: '2', age: '65', gender: 'f', name 'jane'} ];

我可以通过一个嵌套循环来实现这一点,该循环遍历arr1 中的每个对象并检查arr2 中的每个对象,但我想知道是否有一种简化/更有效的方法使用最近的一些函数ECMAScript 的版本(我还在学习)。

【问题讨论】:

    标签: javascript arrays ecma


    【解决方案1】:

    假设 arr1 和 arr2 总是相同的长度并按它们的键排序,你可以这样做:

    let arr3=arr2;
    for (let i = 0;i<arr1.length;i++){
        arr3[i].name=arr1[i].name;
    }
    

    我这样做的输出:

    [
      { key: '12', age: '29', gender: 'm', name: 'john' },
      { key: '9', age: '43', gender: 'm', name: 'steve' },
      { key: '4', age: '19', gender: 'm', name: 'harry' },
      { key: '2', age: '65', gender: 'f', name: 'jane' }
    ]
    
    

    【讨论】:

      【解决方案2】:

      这会起作用。

      const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];
      
      const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];
      
      arr2.map((elm, index) => {
          elm.name = arr1[index].name;
      })
      
      console.log(arr2);

      【讨论】:

        【解决方案3】:

        希望对你有帮助

        const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];
        const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];
        const concat = arr1.concat(arr2);
        
        var arr3 = Object.values(concat.reduce((acc, {key, ...rest})=>{
            acc[key] = {...(acc[key] || {}), ...{key, ...rest}};
            return acc;
        },{}));
        
        console.log(arr3);

        【讨论】:

          【解决方案4】:

          您可以使用 Map 添加名称属性

          const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];
          const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];
          
          map=new Map()
          arr1.map(o=>map.set(o.key,o))
          arr2.forEach(o=>o.name=map.get(o.key).name)
          console.log(arr2)

          【讨论】:

            【解决方案5】:

            const arr1 = [ {key: '12', name: 'john'}, {key: '9', name: 'steve'}, {key: '4', name: 'harry'}, {key: '2', name: 'jane'} ];
            
            const arr2 = [ {key: '12', age: '29', gender: 'm'}, {key: '9', age: '43', gender: 'm'}, {key: '4', age: '19', gender: 'm'}, {key: '2', age: '65', gender: 'f'} ];
            
            function merge(arr1, arr2) {
            
                return arr1.reduce((merged, currentObj)=>{
                    const index = merged.findIndex(ele =>currentObj.key === ele.key);
                    index !== -1 ? merged[index] = {...merged[index], ...currentObj} : merged.push(currentObj);
                    return merged
                },arr2)
            
            }
            
            console.log(merge(arr1,arr2))

            【讨论】:

              猜你喜欢
              • 2022-09-23
              • 1970-01-01
              • 2016-11-27
              • 2022-11-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-10
              相关资源
              最近更新 更多