【问题标题】:Javascript concat values of arrays with same keys具有相同键的数组的Javascript连接值
【发布时间】:2020-11-09 09:58:06
【问题描述】:

我正在尝试合并以下对象:

var permission = { 
  'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
  'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
  'permissions': { 
        devices: [ 'read' ], 
        reports: [ 'read' ] 
    }
}

var newPermission = { 
  devices: [ 'update' ]
}

我的结果应该如下所示:

{ 
  'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
  'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
  'permissions': { 
        devices: [ 'read','update' ], 
        reports: [ 'read' ] 
    }
}

我使用了Object.assign,它没有附加到权限,有没有办法做到这一点。我是 ES6 新手。

【问题讨论】:

标签: javascript arrays merge


【解决方案1】:

var permission = { 'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27', 'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1', 'permissions': { devices: [ 'read' ], reports: [ 'read' ] }};

var newPermission = { devices: [ 'update' ]};

// if you have more number of items in newPermission array like ['update', 'update1', 'update2'], below logic will add all of them after `read`.

newPermission.devices.forEach((item)=>{
   permission.permissions.devices.push(item);
})

console.log(permission);

【讨论】:

    【解决方案2】:

    如何取 entries 的 Object 然后使用 reduce 对它们进行分组。像这样的:

    var permission = { 
      'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
      'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
      'permissions': { 
            devices: [ 'read' ], 
            reports: [ 'read' ] 
        }
    };
    
    var newPermission = { 
      devices: [ 'update' ],
      reports:['delete']
    };
    
    permission.permissions = Object.entries(newPermission).reduce((a, [key, arr])=>{
        a[key] = [...arr, ...permission.permissions[key]] ;
        return a;
    },{});
    
    console.log(permission)

    【讨论】:

      【解决方案3】:

      你可以这样做:

      var permission = { 
        'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
        'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
        'permissions': { 
              devices: [ 'read' ], 
              reports: [ 'read' ] 
          }
      }
      
      var newPermission = { 
        devices: [ 'update' ]
      }
      
      var permissions = permission['permissions'];
      
      for(var key in permissions){
       for(var key2 in newPermission){
         if(key === key2){
          permissions[key] = [...permissions[key], ...newPermission[key]]
         }
       }
      }
      console.log(permission)

      【讨论】:

        【解决方案4】:

        我使用了扩展运算符,就像 Object.assign()。你可以在这里阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

        const permission = { 
          'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
          'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
          'permissions': { devices: [ 'read' ], reports: [ 'read' ] }
        }
        
        const newPermission = { 
          devices: [ 'update' ]
        }
        
        const result = {
          ...permission, // Here we copy the main object permission
          permissions: { // Change the field permissions
            ...permission.permissions, // Copy permissions that do not delete reports and other fields
            devices: [ // Merge two arrays
              ...permission.permissions.devices,
              ...newPermission.devices
            ]
          }
        }
        
        console.log(result)

        【讨论】:

          【解决方案5】:

          var permission = { 
            'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27',
            'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1',
            'permissions': { 
                  devices: [ 'read' ], 
                  reports: [ 'read' ] 
              }
          }
          
          var newPermission = { 
            devices: [ 'update' ],
            reports: [ 'write' ] 
          }
          
          
          var result = Object.fromEntries(
            Object.entries(permission.permissions).map(([key, value]) => {
              if (Object.keys(newPermission).includes(key)) {
                value.push(...newPermission[key]);
              }
              return [key, value];
            })
          );
          
          permission.permissions = result;
          
          console.log(permission);

          【讨论】:

            【解决方案6】:

            如果你想避免使用嵌套循环,这里是使用 Map 的不同方法

             var permission = { 'id': '94cabc1f-d4d3-430d-b41d-ebfb1bd94f27', 'user_id': '7aaac6d2-7316-4e3a-a53f-81b4aa0a14a1', 'permissions': { devices: [ 'read' ], reports: [ 'read' ] } }     
                var newPermission = { 
                  devices: [ 'update' ]
                }
                map=new Map()
                Object.entries(permission.permissions).map(o=>map.set(o[0],o[1]))
                     for(let key in newPermission){
                      upd = map.get(key)
                       if(upd) upd.push(...newPermission[key])
                     }
                
                console.log(permission)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-12-19
              • 2014-08-19
              • 2022-12-04
              • 2015-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多