Как удалить элемент из списка с помощью 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

Ответьте, чтобы сделать запись, чтобы я мог найти ее позже.