Creé un mapa inmutable (con Immutable-JS ) a partir de una lista de objetos:
var result = [{'id': 2}, {'id': 4}]; var map = Immutable.fromJS(result); Ahora quiero obtener el objeto con id = 4 .
¿Hay una manera más fácil que esta:
var object = map.filter(function(obj){ return obj.get('id') === 4 }).first();Esencialmente, no: está realizando una búsqueda de lista por valor, no por índice, por lo que siempre será un recorrido lineal.
Una mejora sería usar find en lugar de filter :
var result = map.find(function(obj){return obj.get('id') === 4;});Lo primero que debe tener en cuenta es que en realidad no está creando un mapa, está creando una lista:
var result = [{'id': 2}, {'id': 4}]; var map = Immutable.fromJS(result); Immutable.Map.isMap(map); // false Immutable.List.isList(map); // true Para crear un mapa, puede usar un argumento reviver en su llamada toJS ( docs ), pero ciertamente no es la API más intuitiva, alternativamente puede hacer algo como:
// lets use letters rather than numbers as numbers get coerced to strings anyway var result = [{'id': 'a'}, {'id': 'b'}]; var map = Immutable.Map(result.reduce(function(previous, current) { previous[ current.id ] = current; return previous; }, {})); Immutable.Map.isMap(map); // trueAhora tenemos un mapa Immutable.js adecuado que tiene un método get
var item = Map.get('a'); // {id: 'a'}Cuando use fromJS para la matriz, obtendrá List not map. Será mejor y más fácil si creas un mapa. El siguiente código convertirá el resultado en un mapa inmutable.
const map = result.reduce((map, json) => map.set(json.id, Immutable.fromJS(json)) , Map());Ahora usted puede
map.get('2'); //{'id': 2}Tenga en cuenta que si el resultado tiene una estructura anidada y si tiene una matriz, será una lista con el código anterior.