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.

1

6 Answers 6

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);

Sign up to request clarification or add additional context in comments.

Comments

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)

Comments

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)

Comments

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)

Comments

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)

Comments

-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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.