Как удалить элемент из списка с помощью lodash?
У меня есть объект, который выглядит так:
var obj = {
"objectiveDetailId": 285,
"objectiveId": 29,
"number": 1,
"text": "x",
"subTopics": [{
"subTopicId": 1,
"number": 1
}, {
"subTopicId": 2,
"number": 32
}, {
"subTopicId": 3,
"number": 22
}]
}
var stToDelete = 2;
У меня в приложении установлен lodash
для других вещей. Есть ли эффективный способ использовать lodash
для удаления записи: {"subTopicId":2, "number":32}
из объекта obj
?
Или есть способ сделать это с помощью javascript?
Ответы
Ответ 1
Как отметили лийоны в комментариях, более идиоматический и lodashy способ сделать это будет использовать _.remove
, как этот
_.remove(obj.subTopics, {
subTopicId: stToDelete
});
Кроме того, вы можете передать предикатную функцию, результат которой будет использоваться для определения того, должен ли текущий элемент быть удален или нет.
_.remove(obj.subTopics, function(currentObject) {
return currentObject.subTopicId === stToDelete;
});
В качестве альтернативы вы можете создать новый массив, отфильтровывая старый _.filter
и назначая его одному и тому же объекту, например
obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
return currentObject.subTopicId === stToDelete;
});
или
obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToDelete});
Ответ 2
Просто используйте vanilla JS. Вы можете использовать splice
, чтобы удалить элемент:
obj.subTopics.splice(1, 1);
Демо
Ответ 3
вы можете сделать это с помощью _pull
.
_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});
проверьте ссылку
Ответ 4
Теперь вы можете использовать _.reject, который позволяет вам фильтровать на основе того, от чего вам нужно избавиться, а не того, что вам нужно сохранить.
в отличие от _.pull
или _.remove
которые работают только с массивами, ._reject
работает с любой Collection
obj.subTopics = _.reject(obj.subTopics, (o) => {
return o.number >= 32;
});
Ответ 5
В дополнение к @thefourtheye ответ, используя предикат вместо традиционных анонимных функций:
_.remove(obj.subTopics, (currentObject) => {
return currentObject.subTopicId === stToDelete;
});
ИЛИ
obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
return currentObject.subTopicId === stToDelete;
});
Ответ 6
Лодаш и машинопись
const clearSubTopics = _.filter(obj.subTopics, topic => (!_.isEqual(topic.subTopicId, 2)));
console.log(clearSubTopics);
Ответ 7
Вот простая функция lodash с массивом и удаление ее с индексным номером.
index_tobe_delete = 1
fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
Ответ 8
Как я знаю, есть четыре способа сделать это
const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;
Первый:
_.reject(array, {id:toDelete})
Второй:
_.remove(array, {id:toDelete})
Таким образом, массив будет видоизменяться.
Третий:
_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item
// _.differenceWith(array,[removeItem])
Последний из них:
_.filter(array,({id})=>id!==toDelete)
Я учусь lodash
Ответьте, чтобы сделать запись, чтобы я мог найти ее позже.