Reputation: 3404
I have following object array:
var arr = [
{
id : "a1",
guid : "sdfsfd",
...
value : "abc",
status: false
},
{
id : "a2",
guid : "sdfsfd",
...
value : "def",
status: true
},
...
]
I have this object:
var obj = {
id : "a1",
guid : "sdfsfd",
...
value : "xyz",
status : true
}
I need to replace the object in the array with this object where the "id" is same. So the resulting array will be:
var arr = [
{
id : "a1",
guid : "sdfsfd",
...
value : "xyz",
status: true
},
{
id : "a2",
guid : "sdfsfd",
...
value : "def",
status: true
},
...
]
Additionally I need to add this object to the array if an object with that id doesn't exists.
How to achieve this using minimal lodash code? Looking for something like
arr = _.merge_by_key(arr,obj,"id");
Upvotes: 7
Views: 18623
Reputation: 583
you can loop and use 'splice' function:
var added = false;
for(var i=0;i<arr.length; i++){
if(arr[i].id === obj.id){
arr.splice(i,1,obj);
added = true;
break;
}
}
if(!added) arr.push(obj);
EDIT: missed added condition
Upvotes: 1
Reputation: 30098
Here's a lodash solution that uses keyBy to create an object wherein each item in the collection is represented by their id
, set to override the new object or possibly add the new object and lastly values to get the array representation of the object.
var result = _(arr).keyBy('id').set(obj.id, obj).values().value();
var arr = [
{
id : "a1",
guid : "sdfsfd",
value : "abc",
status: false
},
{
id : "a2",
guid : "sdfsfd",
value : "def",
status: true
}
];
var obj = {
id : "a1",
guid : "sdfsfd",
value : "xyz",
status : true
}
var result = _(arr).keyBy('id').set(obj.id, obj).values().value();
console.log(result);
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Upvotes: 2
Reputation: 7416
you can do it with _.unionBy
var res = _.unionBy([obj], arr, 'id');
but check a note at this comment
Upvotes: 10
Reputation: 33486
You can use _.findIndex
with the _.matchesProperty
shorthand:
var index = _.findIndex(arr, ['id', obj.id]);
arr[index >= 0 ? index : arr.length] = obj;
var arr = [{
id: "a1",
guid: "sdfsfd",
value: "abc",
status: false
}, {
id: "a2",
guid: "sdfsfd",
value: "def",
status: true
}];
var obj = {
id : "a1",
guid : "sdfsfd",
value : "xyz",
status : true
};
var index = _.findIndex(arr, ['id', obj.id]);
arr[index >= 0 ? index : arr.length] = obj;
console.log(arr);
.as-console-wrapper { min-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Upvotes: 3
Reputation: 1
You can use .findIndex()
var i = arr.findIndex(o => o.id === obj.id);
if (arr[i]) { arr[i] = obj } else { arr.push(obj) };
Upvotes: 7