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

根据属性的值从列表中删除一个对象最简单的方法是什么?

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

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

[{a: '1' , b: '1'},{a: '2' , b: '2'}] 

我想从数组中删除属性设置为'1'的对象。 在MongoDB中,我会这样做:

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

我怎样才能得到与ImmutableJS相同的结果?

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

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

但是,对非空List filter将导致不同的不可变列表,因此您可能首先要检查{a: 1}的出现:

 if (test.some(function(item) { return item.get('a') === '1'; })) { test = test.filter(function(item) { return item.get('a') !== '1' }); } 

你不需要不可变任何特定的东西,只需使用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) }); 

结果是:

 [ { "a" : "2", "b" : "2" } ] 

或者你可以从.filter()中得到相反的值:

 test.filter(function(el) { return el.a != 1; }); 

这实际上并不影响数组,但是您可以随时“覆盖”结果。

如果testvariables已经是一个Immutable对象,那么只需要先用.toArray()转换它,然后重新转换回来。

也许你可以尝试不可变的数据

 var immutableData = require("immutable-data") var oldArray = [{a: '1' , b: '1'},{a: '2' , b: '2'}] var data = immutableData(oldArray) var immutableArray = data.pick() //modify immutableArray by ordinary javascript method var i = 0 immutableArray.forEach(function(item,index){ if (item.a === '1'){ immutableArray.splice(index-i,1) i++ } }) var newArray = immutableArray.valueOf() console.log(newArray) // [ { a: '2', b: '2' } ] console.log(newArray[0]===oldArray[1]) // true