2015-07-16 8 views
16

Quale sarebbe il modo più semplice per eliminare un oggetto da un elenco in base al valore di una proprietà?Elimina oggetto dall'elenco ImmutableJS in base al valore della proprietà

Sto cercando un equivalente di $ pull in MongoDB.

lista sembra semplice come questo:

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

e mi piacerebbe per rimuovere dalla matrice l'oggetto con la proprietà una serie a '1'. In MongoDB, lo farei in questo modo:

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

Come posso ottenere lo stesso risultato con ImmutableJS?

+0

Plain js: 'listIDeleteFrom = listIDeleteFrom.filter (function (item) {return item.a! == 1});' (non sono sicuro di immutabile, quindi il commento) – tymeJV

risposta

-4

Non è necessario alcun Immutabile qualcosa di specifico per questo, basta usare JavaScript prototipi array:

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) 
}); 

risultati in:

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

Oppure si potrebbe ottenere il valore da .filter() con un condizione inversa:

Che non interessa effettivamente l'array "in posto ", ma potresti sempre" sovrascrivere "con il risultato.

Se la variabile test è già un oggetto Immutable, è sufficiente convertirla prima con .toArray() e quindi ritrasmetterla nuovamente.

20

si potrebbe semplicemente filter lista immutabile:

var test = Immutable.List.of(Immutable.Map({a: '1'}), Immutable.Map({a: '2'})); 
test = test.filter(function(item) { return item.get('a') !== '1' }); 

Tuttavia, filter sulla non-vuoto List comporterebbe una diversa lista immutabile, quindi si consiglia di controllare la presenza di {a: 1} prima:

if (test.some(function(item) { return item.get('a') === '1'; })) { 
    test = test.filter(function(item) { return item.get('a') !== '1' }); 
} 
+7

Utilizzo di ['filterNot'] (https://facebook.github.io/immutable-js/docs/#/List/filterNot) invece di 'filter' sarebbe probabilmente leggermente più bello. –

-3

forse si può provare 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

Questo è irrilevante; 'immutable-data' non ha nulla a che fare con Immutable.js. –

Problemi correlati