如何使用lodash从列表中删除元素?


165

我有一个看起来像这样的对象:

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
您可以使用splicedeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)从列表中删除项目
z33m 2014年

1
更改了标题,因为无法以这种方式从数组[1,4,5]中删除4。是的,我确实知道可以从哈希/对象实现数组,并且可能可以实现数组,但是这两者之间存在细微差别。要从数组中删除,请使用result = _.pull(arr, value) 此方法将从列表中删除所有匹配的值。
boatcoder 2015年

Answers:


247

正如lyyons在评论中所指出的那样,更惯用和lo琐的方式是使用_.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: stToKeep});

3
之所以会回答这个问题,是因为您可以使用谓词函数,而这正是我所要的。如果您知道索引,删除元素很简单,但是当您知道索引时怎么
random_user_name 2016年

3
如果您不想变异原始数组,可能值得一提_.filter。–
random_user_name

@cale_b谢谢:-)将答案更新为 _.filter版本。
thefourtheye,2016年

7
_.filter 如果谓词为true,则@thefourtheye 返回一个元素。您的实现将返回所有不需要的元素,而不是要保留的元素
Xeltor

5
您应该使用@thefourtheye _.reject而不是_.filter使用相同的谓词。检查我的答案以获取更多详细信息!
Xeltor

29

只需使用香草JS。您可以使用splice删除元素:

obj.subTopics.splice(1, 1);

演示版


3
用户问Is there an efficient way to use _lodash to delete
semirturgay 2014年

7
@Andy是的,但是如果索引未知,该怎么办?
thefourtheye

3
如果要使数组发生突变,则splice()是最好的方法。如果使用remove,则它将返回新数组,并且必须重新分配该数组。
omarjebari

如果您希望通过数组中的索引从数组中删除某项(显然,如果您希望通过这种方式执行删除操作,则具有该索引),那么使用splice方法是最有效(也是最简单)的方法去做吧。无需进行任何比较,并使代码更复杂且更容易出现错误和错误……
TheCuBeMan

26

你可以做到_pull

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

检查参考


7
根据文档,_.pull使用严格相等进行比较,即===。两个不同的普通对象永远不会===(或==就此而言)相等。因此,您上面的代码将永远不会从数组中删除任何元素。
Mark Amery 2014年

1
但是,这是唯一可以处理数组中的字符串的函数。_.remove只是刷新数组。
Yauheni Prakopchyk 2015年

3
我仍然认为这是正确的答案。JS .filter删除所有匹配的元素,JS .splice要求我知道索引_.remove遍历数组的所有元素,因此效率较低。_.pull正是我想要的:_.pull(array,itemToRemove)。
Judah Gabriel Himango'7

21

您现在可以使用_.reject,它允许您根据需要删除的内容而不是需要保留的内容进行过滤。

不像_.pull_.remove仅适用于阵列,._reject适用于任何 Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});

2

据我所知,有四种方法可以做到这一点

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

回答以作记录,以便以后找到。


我在寻找reject
Sampgun

2

除了@thefourtheye答案外,使用谓词 代替传统的匿名函数:

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

要么

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});


0

这是带有数组的简单lodash函数,并使用索引号将其删除。

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.