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

IT技术 javascript arrays object lodash
2021-03-22 16:17:47

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

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方法可以做到这一点?

6个回答

正如 lyyons 在评论中指出的那样,更惯用和 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: stToKeep});
@cale_b 谢谢:-) 用_.filter版本更新了答案
2021-05-01 16:17:47
如果您不想改变原始数组,可能值得一提_.filter ....
2021-05-02 16:17:47
@thefourtheye 您应该使用_.reject而不是_.filter使用相同的谓词。查看我的答案以获取更多详细信息!
2021-05-07 16:17:47
这个答案swing不定的原因是因为您可以使用谓词函数,这正是我正在寻找的。如果您知道索引,删除元素是微不足道的,但是当您知道索引时呢?
2021-05-12 16:17:47
_.filter 如果谓词为真,@thefourtheye返回一个元素。您的实现将返回所有不需要的元素,而不是您想要保留的元素
2021-05-14 16:17:47

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

obj.subTopics.splice(1, 1);

演示

如果你想通过它在数组中的索引从数组中删除一个项目(显然,如果你想以这种方式执行删除操作,你就有这个索引),那么使用 splice 方法是最有效(和简单)的方法去做吧。不需要比较任何东西,也不需要让代码更复杂,更容易受到错误和错误的影响......
2021-04-25 16:17:47
用户问 Is there an efficient way to use _lodash to delete
2021-04-26 16:17:47
如果您希望数组发生变异, splice() 是最好的方法。如果您使用 remove 则它返回新数组,并且必须重新分配。
2021-05-04 16:17:47
@Andy 你是对的,但是如果索引还不知道怎么办?
2021-05-05 16:17:47

你可以用_pull.

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

检查参考

我仍然认为这是正确的答案。JS .filter 删除所有匹配的元素,JS .splice 要求我知道索引,_.remove 迭代数组的所有元素,因此效率较低。_.pull 正是我想要的:_.pull(array, itemToRemove)。
2021-04-28 16:17:47
然而,这是唯一一种处理数组中的字符串的方法。_.remove只是刷新数组。
2021-04-30 16:17:47
根据文档,_.pull使用严格相等进行比较,即 ===两个不同的普通对象永远不会比较相等===(或==就此而言)。因此,您上面的代码永远不会从数组中删除任何元素。
2021-05-07 16:17:47

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

不同于_.pull_.remove仅适用于阵列,._reject正在处理任何 Collection

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

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

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
2021-05-15 16:17:47