Удалить объект из массива на основе массива некоторого свойства этого объекта - программирование
Подтвердить что ты не робот

Удалить объект из массива на основе массива некоторого свойства этого объекта

У меня есть массив объектов (objList), каждый из которых имеет свойство "id".

У меня есть массив строк (idsToRemove), представляющих идентификаторы объектов для удаления из objList.

Я нахожу какое-то решение, но боюсь, что оно медленное, особенно с большим списком объектов с большим количеством свойств. Есть ли более эффективный способ сделать это?

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

Ответ 1

Превратите idsToRemove в Set чтобы вы могли использовать Set.prototype.has (Set.prototype.has O(1)), и .filter objList только один раз, так что общая сложность 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);

Ответ 2

Вы можете использовать Array.includes который проверяет, существует ли данная строка в указанном массиве, и комбинировать ее с Array.filter.

const idsToRemove = ['3', '1'];

const objList = [{
    id: '1',
    name: 'aaa',
  },
  {
    id: '2',
    name: 'bbb',
  },
  {
    id: '3',
    name: 'ccc',
  },
];

const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

console.log(filteredObjList);

Ответ 3

Вам не нужны два вложенных итератора, если вы используете встроенную функцию поиска

   objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);

Документация:

Array.prototype.indexOf()

Array.prototype.includes()

Ответ 4

Просто используйте Array.filter()

const idsToRemove = ['3', '1'];

const objList = [{
    id: '1',
    name: 'aaa',
  },
  {
    id: '2',
    name: 'bbb',
  },
  {
    id: '3',
    name: 'ccc',
  }
];

const res = objList.filter(value => !idsToRemove.includes(value.id));

console.log("result",res);