2

I am trying to merge below objects:

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

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

My result should look like below:

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

I have used Object.assign and it's not appending to permissions, is there a way to accomplish this. I am new to ES6.

Sven.hig
  • 4,449
  • 2
  • 8
  • 18
naveen
  • 107
  • 1
  • 1
  • 10
  • Does this answer your question? [Merge javascript objects in array with same key](https://stackoverflow.com/questions/33850412/merge-javascript-objects-in-array-with-same-key) – mgm793 Jul 20 '20 at 07:28

6 Answers6

1

You can do something like this:

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)
ABGR
  • 4,631
  • 4
  • 27
  • 49
1

I used spread operators, it is like Object.assign(). You can read about this here 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)
AlexAV-dev
  • 1,165
  • 4
  • 14
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' ],
  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);
Sivakumar Tadisetti
  • 4,865
  • 7
  • 34
  • 56
1

If you want to avoid using nested loops here is a different approach using 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)
Sven.hig
  • 4,449
  • 2
  • 8
  • 18
0

How about taking entries of Object and then using reduce to group them. Something like this:

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)
gorak
  • 5,233
  • 1
  • 7
  • 19
-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);
micronyks
  • 54,797
  • 15
  • 112
  • 146