Удалить объект из списка ImmutableJS на основе значения свойства

Каким будет самый простой способ удалить объект из списка на основе значения свойства?

Я ищу эквивалент $pull в MongoDB.

Мой список выглядит просто так:

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

И я хотел бы удалить из массива объект с свойством set в '1'. В MongoDB я бы сделал это следующим образом:

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

Как я могу получить тот же результат с ImmutableJS?

Ответы

Ответ 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' });
}

Ответ 2

возможно, вы можете попробовать 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

Ответ 3

Вам не нужно Неизбежно ничего для этого, просто используйте прототипы массива 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() и повторно отложите назад.