2015-04-24 17 views
8

Ich verwende Facebook's Immutable.js, um meine React-Anwendung zu beschleunigen, um die PureRender mixin zu nutzen. Eine meiner Datenstrukturen ist eine Map() und einer der Schlüssel in dieser Karte hat einen List<Map>() als seinen Wert. Was ich mich wundere ist, nicht wissen, den Index des Elements, das ich von der List() entfernen möchte, was ist der beste Weg, um es zu entfernen? Bis jetzt bin ich auf das Folgende gekommen. Ist das der beste (effizienteste) Weg?Die beste Methode zum Entfernen eines Elements aus einer Liste innerhalb einer Karte in Immutable.js

// this.graphs is a Map() which contains a List<Map>() under the key "metrics" 
onRemoveMetric: function(graphId, metricUUID) { 
    var index = this.graphs.getIn([graphId, "metrics"]).findIndex(function(metric) { 
     return metric.get("uuid") === metricUUID; 
    }); 
    this.graphs = this.graphs.deleteIn([graphdId, "metrics", index]); 
} 

(. Ich betrachtet haben die List<Map>() zu einem Map() bewegt, da sich jedes Element in der Liste eine UUID hat aber ich bin nicht an diesem Punkt noch)

Antwort

15

könnten Sie Map.filter verwenden:

Vom Leistungspunkt aus wäre der Wechsel zu einer Map wahrscheinlich effizienter, da dieser Code (wie der Ihre) über die Elemente in der Liste iterieren muss.

+0

Sicherlich viel prägnanter als meins! Und ja, die Lösungen, die Sie und ich beide haben, ich glaube nicht, dass es effizienter gemacht werden kann, ohne zu einer "Map" zu wechseln. –

+3

Sie können nun [updateIn] (https://facebook.github.io/immutable-js/docs/#/List/updateIn) anstelle von 'this.graphs.getIn ([graphId," metrics "]) verwenden '. – YakirNa

4

Mit updateIn wie von @YakirNa vorgeschlagen wird dies wie folgt aussehen.

ES6:

onRemoveMetric(graphId, metricUUID) { 
    this.graphs = this.graphs.updateIn([graphId, 'metrics'], 
     (metrics) => metrics.filter(
     (metric) => metric.get('uuid') !== metricUUID 
    ) 
    ); 
    } 

ES5:

onRemoveMetric: function(graphId, metricUUID) { 
    this.graphs = this.graphs.updateIn([graphId, "metrics"], function(metrics) { 
     return metrics.filter(function(metric) { 
     return metric.get("uuid") !== metricUUID; 
     }); 
    }); 
    } 
Verwandte Themen