从对象数组中查找和删除对象

Find and remove object from array of objects

本文关键字:对象 删除 查找 数组      更新时间:2023-09-26

我有 2 个对象数组。
阵列 1:

[{ id: 2, ref: 1010101 },
 { id: 2, ref: 1010107 }]

数组 2:

[{ id: 2, ref: 10010001 },
 { id: 2, ref: 10010002 },
 { id: 2, ref: 10010003 },
 { id: 2, ref: 10010006 },
 { id: 2, ref: 10010007 },
 { id: 2, ref: 10010008 },
 { id: 2, ref: 10010009 },
 { id: 2, ref: 10020005 },
 { id: 2, ref: 1010101 }]

我需要做 2 个任务:
1. 查找数组 1 的哪些元素在数组 2 中。找到项目后,我将对该元素执行一些操作。
2. 删除从 array2 中找到的元素。对找到的项目执行某些操作后,我需要删除找到的每个项目。

我试图用 lodash 来做这件事,但没有成功。

我需要这样的东西:

if(elementFound) {
  //do something
  doSomething(item);
  //after it, remove from array2
  removeItemFromArray2(item);
}

谢谢,我认为有一种简单的方法可以用 lodash 做到这一点。

尝试在此上下文中使用Array.prototype.filter来实现您想要的,

var filteredArray = Array2.filter(function(itm){
 return Array1.filter(function(itmIn){
   return itmIn.id === itm.id && itmIn.ref === itm.ref;
 }).length == 0;
});

有一个特定的 lodash 函数:

var array1 = [
  { id: 2, ref: 1010101 },
  { id: 2, ref: 1010107 }
];
var array2 = [
  { id: 2, ref: 10010001 },
  { id: 2, ref: 10010002 },
  { id: 2, ref: 10010003 },
  { id: 2, ref: 10010006 },
  { id: 2, ref: 10010007 },
  { id: 2, ref: 10010008 },
  { id: 2, ref: 10010009 },
  { id: 2, ref: 10020005 },
  { id: 2, ref: 1010101 }
];
var res = _.differenceBy(array2, array1, 'ref');
document.write("<pre>" + JSON.stringify(res, null, 3) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>

当然有!可以使用 _.remove 以编程方式从array2中删除满足特定谓词的元素。在您的情况下,该谓词将是"是array1中的元素",

var array1 = [{ id: 2, ref: 1010101 },
 { id: 2, ref: 1010107 }]
var array2 = [{ id: 2, ref: 10010001 },
 { id: 2, ref: 10010002 },
 { id: 2, ref: 10010003 },
 { id: 2, ref: 10010006 },
 { id: 2, ref: 10010007 },
 { id: 2, ref: 10010008 },
 { id: 2, ref: 10010009 },
 { id: 2, ref: 10020005 },
 { id: 2, ref: 1010101 }]
_.remove(array2, function (item) {
  return _.find(array1, item);
});
document.write("<pre>" + JSON.stringify(array2, null, 2) + "</pre>")
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>

具有

线性 O 的解。

var array1 = [{ id: 2, ref: 1010101 }, { id: 2, ref: 1010107 }],
    array2 = [{ id: 2, ref: 10010001 }, { id: 2, ref: 10010002 }, { id: 2, ref: 10010003 }, { id: 2, ref: 10010006 }, { id: 2, ref: 10010007 }, { id: 2, ref: 10010008 }, { id: 2, ref: 10010009 }, { id: 2, ref: 10020005 }, { id: 2, ref: 1010101 }],
    result = function (a, b) {
        function k(x) { return x.id + '|' + x.ref; }
        var o = {};
        b.forEach(function (c) {
            o[k(c)] = true;
        });
        a.forEach(function (c) {
            o[k(c)] = false;
        });
        return b.filter(function (c) {
            return o[k(c)];
        });
    }(array1, array2);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');