2015-07-16 2 views
16

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

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

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

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

И я хотел бы, чтобы удалить из массива объект со свойством в установлен в «1». В MongoDB, я бы сделал это так:

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

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

+0

Plain js: 'listIDeleteFrom = listIDeleteFrom.filter (function (item) {return item.a! == 1});' (не уверен относительно неизменяемости, следовательно, комментарий) – tymeJV

ответ

-4

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

20

Вы могли бы просто 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' }); 
} 
+7

Использование ['filterNot'] (https://facebook.github.io/immutable-js/docs/#/List/filterNot) вместо 'filter', возможно, будет немного красивее. –

-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 
+0

Это не имеет значения; 'immutable-data' не имеет ничего общего с Immutable.js. –

Смежные вопросы