Удалить объект из массива на основе массива некоторого свойства этого объекта
У меня есть массив объектов (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);
Ответы
Ответ 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);