Updating objects in an array (matching by value)

Have first array (a) and second with updated values (b). Need to update matching by IDs objects and get result array (c). How can I make it simple and fast?

let a = [
    { id: 1, activated: '0' },
    { id: 2, activated: '0' },
    { id: 3, activated: '0' },
    { id: 4, activated: '0' },
  ]
let b = [
    { id: 2, activated: '1' },
    { id: 3, activated: '1' },
  ]
//Result array:
c = [ 
  { id: 1, activated: '0' },
  { id: 2, activated: '1' },
  { id: 3, activated: '1' },
  { id: 4, activated: '0' },
]

Upvotes: 2

Views: 2291

Answers (7)

B45i
B45i

Reputation: 2601

This is how I would approach it:

function mergeArray(...toMerge) {
  let output = {};
  toMerge.forEach(arr => {
    arr.forEach(item => {
      output[item.id] = item;
    });
  });
  return Object.values(output);
}

let a = [
    { id: 1, activated: '0' },
    { id: 2, activated: '0' },
    { id: 3, activated: '0' },
    { id: 4, activated: '0' },
  ];
let b = [
    { id: 2, activated: '1' },
    { id: 3, activated: '1' },
  ];

console.dir(mergeArray(a, b)) // can merge n-number of arrays.

Upvotes: 1

kimlianlopez
kimlianlopez

Reputation: 116

You can use Array.map, then foreach object, you can use Array.find to check if it exist in arrayB by ID and return if it does.

let a = [
    { id: 1, activated: '0' },
    { id: 2, activated: '0' },
    { id: 3, activated: '0' },
    { id: 4, activated: '0' },
];

let b = [
    { id: 2, activated: '1' },
    { id: 3, activated: '1' },
];

const c = a.map(e => {
    let newValue = b.find(n => e.id === n.id);

    if (!!newValue) {
        return newValue;
    }

    return e;
});

Upvotes: 1

Sascha A.
Sascha A.

Reputation: 4616

Building a hash from the ids of array a. Iterate over array b by looking in the hash for the index b.id, if found actualisize in a with the founded index the property activated. Otherwise (in example id: 5) there don't exists in the old array a for this id an entry so create a new one and actualisize the hash.

let a = [
    { id: 1, activated: '0' },
    { id: 2, activated: '0' },
    { id: 3, activated: '0' },
    { id: 4, activated: '0' },
  ];
let b = [
    { id: 2, activated: '1' },
    { id: 3, activated: '1' },
    { id: 5, activated: '0' },
  ];

let hash = a.flatMap(el => el.id);

b.forEach(elem => {
    index = hash.indexOf(elem.id);
    if (index!=-1) 
        a[index].activated=elem.activated;
     else {
        a.push(elem);
        hash.push(elem.id);
     }
});
  
console.log(a);  

Upvotes: 0

trincot
trincot

Reputation: 350310

You could create a map of the second array, keyed by id, and then when you make a copy of a objects into c, use that map to merge matching b objects into them.

let a = [{ id: 1, activated: '0' },{ id: 2, activated: '0' },{ id: 3, activated: '0' },{ id: 4, activated: '0' }]
let b = [{ id: 2, activated: '1' },{ id: 3, activated: '1' }];

let map = new Map(b.map(o => [o.id, o]));
let c = a.map(o => ({...o, ...map.get(o.id)}));

console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 0

jamomani
jamomani

Reputation: 983

let c = a.map( aObj => {
  let found = b.find(bObj => bObj.id === aObj.id);
    if(found) return found;
    else return aObj;
});

Upvotes: 0

Ele
Ele

Reputation: 33726

I recommend you to create an object where keys are the ids for fast access.

With the newly created object you can access the specific objects from b using the id as key and update the objects.

Finally, get the array c using the function Object.values.

This is assuming that b has ids that exist in a.

let a = [    { id: 1, activated: '0' },    { id: 2, activated: '0' },    { id: 3, activated: '0' },    { id: 4, activated: '0' }]
let b = [    { id: 2, activated: '1' },    { id: 3, activated: '1' }];
let newA = a.reduce((a, {id, ...rest}) => ({...a, ...{[id]: {id, ...rest}}}), {});

b.forEach(({id, activated}) => newA[id].activated = activated);

let c = Object.values(newA);
console.log(c);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 2

Varun Suresh Kumar
Varun Suresh Kumar

Reputation: 879

Try this

let a = [{
    id: 1,
    activated: '0'
  },
  {
    id: 2,
    activated: '0'
  },
  {
    id: 3,
    activated: '0'
  },
  {
    id: 4,
    activated: '0'
  },
]
let b = [{
    id: 2,
    activated: '1'
  },
  {
    id: 3,
    activated: '1'
  },
]
//Result array:
c = [{
    id: 1,
    activated: '0'
  },
  {
    id: 2,
    activated: '1'
  },
  {
    id: 3,
    activated: '1'
  },
  {
    id: 4,
    activated: '0'
  },
]

let result = a.map(e => {
  let p = b.find(be => be.id === e.id)
  if (p) e.activated = p.activated;
  return e
})

console.log(result)

Upvotes: -1

Related Questions