繁体   English   中英

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

[英]Delete object from ImmutableJS List based upon property value

基于属性值从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' });
}

你不需要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) 
});

结果是:

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

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

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

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

如果test变量已经是一个Immutable对象,那么首先用.toArray()转换它,然后重新.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM