如何在javascript(lodash)中替换对象数组中的对象

时间:2017-02-16 05:51:48

标签: javascript lodash

我有以下对象数组:

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
}

我需要用“id”相同的对象替换数组中的对象。因此得到的数组将是:

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

此外,如果具有该id的对象不存在,我需要将此对象添加到数组中。

如何使用最小https://www.npmjs.com/package/clipboard代码实现此目的? 寻找像

这样的东西
arr = _.merge_by_key(arr,obj,"id");

5 个答案:

答案 0 :(得分:5)

您可以使用_.unionBy

执行此操作
var res = _.unionBy([obj], arr, 'id');

但请查看this comment

上的备注

答案 1 :(得分:4)

您可以使用.findIndex()

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

答案 2 :(得分:2)

您可以_.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>
&#13;
&#13;
&#13;

答案 3 :(得分:2)

这是一个使用keyBy创建对象的lodash解决方案,其中集合中的每个项目由其idset表示,以覆盖新对象或可能添加新对象最后values获取对象的数组表示。

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>

答案 4 :(得分:0)

你可以循环使用&#39; splice&#39;功能:

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);

编辑:错过了附加条件