2015-07-16 9 views
16

Was wäre der einfachste Weg, um ein Objekt aus einer Liste basierend auf einem Wert einer Eigenschaft zu löschen?Objekt aus ImmutableJS Liste löschen basierend auf Eigenschaftswert

Ich bin auf der Suche nach einem Äquivalent der $ Pull in MongoDB.

Meine Liste sieht wie folgt einfach:

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

Und ich möchte aus dem Array das Objekt mit Eigenschafts eine auf ‚1‘ entfernen. In MongoDB, würde ich es tun, wie folgt:

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

Wie kann ich das gleiche Ergebnis mit ImmutableJS bekommen?

+0

Plain js: 'listIDeleteFrom = listIDeleteFrom.filter (funktion (item) {return item.a! == 1});' (nicht sicher über unveränderbar, daher der Kommentar) – tymeJV

Antwort

-4

Sie haben keine unveränderliche müssen alle etwas spezifisch für diese, nur JavaScript-Array-Prototypen verwenden:

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

Ergebnisse in:

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

Oder Sie könnten nur den Wert von .filter() mit einem bekommen umgekehrter Zustand:

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

Welche betrifft nicht tatsächlich das Array "in platzieren ", aber Sie könnten immer mit dem Ergebnis" überschreiben ".

Wenn die test Variable bereits ein Immutable Objekt ist, dann wandeln Sie es einfach mit .toArray() um und werfen Sie es zurück.

20

Sie könnten einfach filter die unveränderliche Liste:

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

jedoch filter auf nicht leere List würde eine andere unveränderliche Liste führen, so sollten Sie das Auftreten von {a: 1} zuerst überprüfen:

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

Verwenden von ['filterNot'] (https://facebook.github.io/immutable-js/docs/#/List/filterNot) anstelle von 'filter' wäre wohl etwas hübscher. –

-3

vielleicht können Sie 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 
versuchen
+0

Dies ist irrelevant; 'immutable-data' hat nichts mit Immutable.js zu tun. –

Verwandte Themen