How to replace an object in an array of objects in javascript (lodash)

I have the following array of objects:

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 "id" is the same. Thus, the resulting array will be:

var arr = [
  {
    id    : "a1",
    guid  : "sdfsfd",
    ...
    value : "xyz",
    status: true
  },
  {
    id    : "a2",
    guid  : "sdfsfd",
    ...
    value : "def",
    status: true
  },
  ...
]

In addition, I need to add this object to the array if an object with this identifier does not exist.

How to achieve this using minimal lodash code? Looking for something like

arr = _.merge_by_key(arr,obj,"id");
+4
source share
5 answers

you can do it with _.unionBy

var res = _.unionBy([obj], arr, 'id');

but mark a note in this comment

+5
source

you can use .findIndex()

var i = arr.findIndex(o => o.id === obj.id);
if (arr[i]) { arr[i] = obj } else { arr.push(obj) };
+2
source

_.findIndex _.matchesProperty :

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>
+2

Here's a lodash solution that uses keyBy to create an object in which every element in the collection represents them id, set to override a new object, or possibly add a new object, and finally values to get a representation of the array 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>
Run code
+2
source

you can execute the loop and use the "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

0
source

Source: https://habr.com/ru/post/1669898/


All Articles