Reputation: 39
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
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
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
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
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
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
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
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