根据属性值从ImmutableJS List中删除对象

use*_*212 19 javascript node.js immutable.js

基于属性值从List中删除对象的最简单方法是什么?

我正在寻找相当于MongoDB的$ pull.

我的列表看起来像这样简单:

[{a: '1' , b: '1'},{a: '2' , b: '2'}]
Run Code Online (Sandbox Code Playgroud)

我想从数组中删除与属性的对象组为"1".在MongoDB中,我会这样做:

Model.update({_id: getCorrectParentObj},{ $pull: {listIDeleteFrom: { a: '1' } } },(err, result)=>{});
Run Code Online (Sandbox Code Playgroud)

如何使用ImmutableJS获得相同的结果?

okm*_*okm 23

你可以简单地filter使用不可变列表:

var test = Immutable.List.of(Immutable.Map({a: '1'}), Immutable.Map({a: '2'}));
test = test.filter(function(item) { return item.get('a') !== '1' });
Run Code Online (Sandbox Code Playgroud)

但是,filter非空时List会产生不同的不可变列表,因此您可能要检查{a: 1}第一个的出现:

if (test.some(function(item) { return item.get('a') === '1'; })) {
    test = test.filter(function(item) { return item.get('a') !== '1' });
}
Run Code Online (Sandbox Code Playgroud)

  • 使用[`filterNot`](https://facebook.github.io/immutable-js/docs/#/List/filterNot)代替`filter`可能会稍微漂亮一些. (8认同)

Bla*_*ven -7

你不需要 Immutable 任何特定的东西,只需使用 JavaScript 数组原型:

var test = [{a: '1' , b: '1'},{a: '2' , b: '2'}];

test.map(function(el,idx) { 
    return ( el.a == "1") ? idx : -1 
} ).filter(function(el) { 
    return el != -1 
}).forEach(function(el) { 
   test.splice(el,1) 
});
Run Code Online (Sandbox Code Playgroud)

结果是:

[ { "a" : "2", "b" : "2" } ]
Run Code Online (Sandbox Code Playgroud)

.filter()或者您可以通过相反的条件获取值:

test.filter(function(el) {
    return el.a != 1;
});
Run Code Online (Sandbox Code Playgroud)

这实际上并不影响“就地”数组,但您始终可以用结果“覆盖”。

如果test变量已经是一个Immutable对象,那么只需先将其转换.toArray(),然后重新转换回来。