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

Sam*_*tar 152 javascript arrays object 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;
Run Code Online (Sandbox Code Playgroud)

lodash在我的应用程序中安装了其他东西.是否有一种有效的方法来lodash删除条目:{"subTopicId":2, "number":32}obj对象?

或者有一种javascript方式来做到这一点?

the*_*eye 234

正如lyyons在评论中指出的那样,更多惯用和lodashy的方法是使用_.remove,像这样

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});
Run Code Online (Sandbox Code Playgroud)

除此之外,您可以传递谓词函数,其结果将用于确定是否必须删除当前元素.

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过过滤旧数组_.filter并将其分配给同一对象来创建新数组,如下所示

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});
Run Code Online (Sandbox Code Playgroud)

要么

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});
Run Code Online (Sandbox Code Playgroud)

  • @thefourtheye`_.filter`如果谓词为真,则返回一个元素.您的实现将返回所有不需要的元素,而不是您想要保留的元素 (7认同)
  • @thefourtheye你应该使用`_.reject`而不是`_.filter`来使用相同的谓词.查看[我的回答](/sf/answers/3118723191/)了解更多详情! (4认同)
  • 这个答案的原因是因为你可以使用*谓词函数*,这正是我所寻找的.如果你知道索引,删除一个元素是微不足道的,但是当你*不知道索引时呢? (3认同)
  • 如果你不想改变原始数组,可能值得一提[_.filter](https://lodash.com/docs#filter).... (3认同)

And*_*ndy 29

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

obj.subTopics.splice(1, 1);
Run Code Online (Sandbox Code Playgroud)

演示

  • @sMr:看到问题的其余部分"或者有一种javascript方式来做到这一点"...... (41认同)
  • 用户询问“是否有一种有效的方法可以使用 _lodash 进行删除” (10认同)
  • @Andy你是对的,但如果指数还不知道怎么办? (6认同)
  • 如果你想让你的数组发生变异,splice()是最好的方法.如果使用remove,则返回新数组,并且必须重新分配. (3认同)

sem*_*gay 21

你可以做到_pull.

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});
Run Code Online (Sandbox Code Playgroud)

检查参考

  • 根据文档,[`_.pull`](https://lodash.com/docs#pull)使用*严重相等进行比较,即===*.两个不同的普通对象永远不会通过`==='(或者通过`==`)来比较.因此,上面的代码永远不会从数组中删除任何元素. (7认同)
  • 我仍然认为这是正确的答案.JS .filter删除所有匹配的元素,JS .splice要求我知道索引,_.remove迭代数组的所有元素,因此效率较低._.pull正是我想要的:_.pull(array,itemToRemove). (3认同)

小智 18

最简单、最方便的方法——

_.without([2, 1, 2, 3], 1, 2);
// => [3]
Run Code Online (Sandbox Code Playgroud)

_.without文档。


Xel*_*tor 16

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

不同于_.pull或者_.remove仅适用于数组,._reject正在研究任何 数组Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});
Run Code Online (Sandbox Code Playgroud)


mql*_*tie 7

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

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;
Run Code Online (Sandbox Code Playgroud)

首先:

_.reject(array, {id:toDelete})
Run Code Online (Sandbox Code Playgroud)

第二个是:

_.remove(array, {id:toDelete})
Run Code Online (Sandbox Code Playgroud)

通过这种方式,数组将发生变异。

第三个是:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])
Run Code Online (Sandbox Code Playgroud)

最后一个是:

_.filter(array,({id})=>id!==toDelete)
Run Code Online (Sandbox Code Playgroud)

我在学习 lodash

回答做个记录,方便以后找。