根据对象的某些属性的数组从数组中删除对象

Dal*_*bor 20 javascript arrays performance

我有一个对象数组(objList),每个对象都有“ id”属性。

我有一个字符串数组(idsToRemove),表示要从objList中删除的对象的ID。

我找到了一些解决方案,但我担心它很慢,尤其是对于具有许多属性的大量对象而言。有更有效的方法吗?

var idsToRemove = ["3", "1"];
var objList = [{
    id: "1",
    name: "aaa"
  },
  {
    id: "2",
    name: "bbb"
  },
  {
    id: "3",
    name: "ccc"
  }
];

for (var i = 0, len = idsToRemove.length; i < len; i++) {
  objList = objList.filter(o => o.id != idsToRemove[i]);
}

console.log(objList);
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 35

idsToRemove成一个Set让你可以使用Set.prototype.has(的O(1)工作),并.filterobjList只有一次,让整体的复杂性是O(n)(你只遍历可能,庞大的objList一次):

var idsToRemove = ["3", "1"];
var objList = [{
    id: "1",
    name: "aaa"
  },
  {
    id: "2",
    name: "bbb"
  },
  {
    id: "3",
    name: "ccc"
  }
];

const set = new Set(idsToRemove);
const filtered = objList.filter(({ id }) => !set.has(id));
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)

请注意,Array.prototype.includesand Array.prototype.indexOf操作O(N)不是O(1),因此,如果您使用它们代替a Set,则它们可能会花费更长的时间。