2015-04-24 4 views
8

Я использую Facebook's Immutable.js, чтобы ускорить приложение React, чтобы воспользоваться PureRender mixin. Одна из моих структур данных - Map(), и один из ключей на этой карте имеет значение List<Map>(). Мне интересно, не зная индекс элемента, который я хочу удалить из List(), что это лучший способ его удалить? До сих пор я придумал ниже. Это лучший (самый эффективный) способ?Лучший способ удалить элемент из списка внутри карты в 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]); 
} 

(. Я рассмотрел перемещение List<Map>() к Map() самого, поскольку каждый элемент в списке имеет UUID, однако, я не в тот момент еще)

ответ

15

Вы можете использовать Map.filter:

С точки зрения производительности переход на карту, вероятно, будет более эффективным, так как этот код (например, ваш) должен перебирать элементы в списке.

+0

Конечно гораздо более кратким, чем у меня! И да, решения, которые у вас и у меня есть, я не думаю, что это можно сделать более эффективным, не переключаясь на «карту». –

+3

вы можете использовать [updateIn] (https://facebook.github.io/immutable-js/docs/#/List/updateIn) вместо повторения 'this.graphs.getIn ([graphId, "metrics"]) '. – YakirNa

4

Использование updateIn как предложено @YakirNa, это будет выглядеть ниже.

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