【问题标题】:Delete object from ImmutableJS List based upon property value根据属性值从 ImmutableJS 列表中删除对象
【发布时间】:2015-07-16 23:51:21
【问题描述】:

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

我正在寻找 MongoDB 中的 $pull 等效项。

我的列表看起来很简单,如下所示:

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

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

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

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

【问题讨论】:

  • 纯js:listIDeleteFrom = listIDeleteFrom.filter(function(item) { return item.a !== 1 });(不确定不可变,因此评论)

标签: javascript node.js immutable.js


【解决方案1】:

您可以简单地 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' });
}

【讨论】:

  • 使用filterNot 而不是filter 可能会更漂亮一些。
【解决方案2】:

你不需要 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(),然后再重新转换。

【讨论】:

    【解决方案3】:

    也许你可以试试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
    

    【讨论】:

    • 这无关紧要; immutable-data 与 Immutable.js 没有任何关系。
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多