根据属性值从List中删除对象的最简单方法是什么?
我正在寻找相当于MongoDB中的$ pull。
我的列表看起来很简单:
[{a: '1' , b: '1'},{a: '2' , b: '2'}]
我想从数组中删除属性 a 设置为' 1'的对象。在MongoDB中,我这样做:
Model.update({_id: getCorrectParentObj},{ $pull: {listIDeleteFrom: { a: '1' } } },(err, result)=>{});
如何使用ImmutableJS获得相同的结果?
答案 0 :(得分:22)
您可以简单地filter
不可变列表:
var test = Immutable.List.of(Immutable.Map({a: '1'}), Immutable.Map({a: '2'}));
test = test.filter(function(item) { return item.get('a') !== '1' });
但是,非空filter
上的List
会产生不同的不可变列表,因此您可能需要首先检查{a: 1}
的出现次数:
if (test.some(function(item) { return item.get('a') === '1'; })) {
test = test.filter(function(item) { return item.get('a') !== '1' });
}
答案 1 :(得分:-7)
您不需要任何特定于此的任何内容,只需使用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;
});
这实际上并不影响“就地”数组,但您总是可以“覆盖”结果。
如果test
变量已经是Immutable对象,那么首先将其转换为.toArray()
,然后重新转换。
答案 2 :(得分:-7)
也许你可以尝试immutable-data
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