How to modify & replace the key an object by comparing it with other objects?

Viewed 295

I have an array of object which consists some id's as a key.

const sampleObj1 = {0011:[{},{}], 0022:[{}, {}], 0033:[{},{}]}
const sampleObj2 = [{id:0011, name:'test1'}, {id:0022, name:'test2'}, {id:0033, name:'test3'}]

I want to compare sampleObj1 key with the sampleObj2 id value and then need to create new obj some like below.

const newObjByComparing = {test1:[{},{}], test2:[{},{}], test3:[{},{}]} //desired result 

I have tried using for loop but not able to get the desired compared value.

const fromRdx = sampleObj2; 
const fromApi = sampleObj1; 
const keys = Object.keys(fromApi);
const newObjAfterComparision = {};

for (let i in fromRdx) {
    newObjAfterComparision[fromRdx[i]] = fromApi[keys[i]];
    fromApi[fromRdx[i]] = fromApi[keys[i]];
    delete fromApi[keys[i]];
}

console.log(newObjAfterComparision)
3 Answers

The below may be one possible solution to achieve the desired objective:

Code Snippet

const transformObj = (obj, arr) => arr.reduce((f, i) => ({
  ...f,
  [i.name]: obj[i.id]
}), {});

const sampleObj = {
  "0011": [{}, {}],
  "0022": [{}, {}],
  "0033": [{}, {}]
};
const sampleArr = [{
  id: "0011",
  name: "test1"
}, {
  id: "0022",
  name: "test2"
}, {
  id: "0033",
  name: "test3"
}];

console.log(transformObj(sampleObj, sampleArr));

Expalanation

  • Use .reduce() to iterate over the sampleArr
  • For each element populate a result obj (named f)
  • The key of the object will be the element's name and value will be the value from the sampleObj (where key is element's id)

Another approach using map and Object.fromEntries

const sampleObj1 = {'0011':[{},{}], '0022':[{}, {}], '0033':[{},{}]}
const sampleObj2 = [{id:'0011', name:'test1'}, {id:'0022', name:'test2'}, {id:'0033', name:'test3'}]


let y = Object.fromEntries(sampleObj2.map(({id,name}) => [name,sampleObj1[id]]))

console.log(y)

I Have a simple solution for you

const sampleObj1 = {0011:[{},{}], 0022:[{}, {}], 0033:[{},{}]}
const sampleObj2 = [{id:0011, name:'test1'}, {id:0022, name:'test2'}, {id:0033, name:'test3'}]

const keys = Object.keys(sampleObj1);
const newObjByComparing = sampleObj2.reduce((acc, cur, index) => {
    acc[cur.name] = sampleObj1[keys[index]];
    return acc;
}, {});

Related