w3schools tag tab page change javascript angularjs map

javascript - tag - title of page html



Usando el mapa de matriz para filtrar los resultados con condicional (2)

Deberías usar Array.prototype.reduce para hacer esto. Hice una pequeña prueba de JS perf para verificar que esto es más .filter que hacer un .filter + .map .

$scope.appIds = $scope.applicationsHere.reduce(function(ids, obj){ if(obj.selected === true){ ids.push(obj.id); } return ids; }, []);

Para mayor claridad, aquí está la muestra .reduce que usé en la prueba JSPerf:

var things = [ {id: 1, selected: true}, {id: 2, selected: true}, {id: 3, selected: true}, {id: 4, selected: true}, {id: 5, selected: false}, {id: 6, selected: true}, {id: 7, selected: false}, {id: 8, selected: true}, {id: 9, selected: false}, {id: 10, selected: true}, ]; var ids = things.reduce((ids, thing) => { if (thing.selected) { ids.push(thing.id); } return ids; }, []); console.log(ids)

EDITAR 1

Nota: A partir de 2/2018, Reducir + Empujar es más rápido en Chrome y Edge, pero más lento que Filtro + Mapa en Firefox

Estoy tratando de usar un mapa de matriz para filtrar un objeto un poco más para prepararlo para enviarlo al servidor para guardarlo. Puedo filtrar a 1 valor clave, lo que es genial, pero quiero dar un paso más y compararlos con un booleano en el interior.

Entonces, ahora mismo esto es lo que tengo ...

$scope.appIds = $scope.applicationsHere.map( function(obj){ if(obj.selected == true){ return obj.id; } });

Esto funciona muy bien para extraer los ID, sin embargo, no quiero introducirlos en esta nueva matriz si tienen el valor seleccionado == falso, por lo que puse un condicional para filtrar más. Esto funciona de alguna manera, obtengo una matriz de ID, pero las ID que tienen .selected == false todavía están en la matriz, solo con el valor nulo. Entonces, si tengo 4 elementos en el objeto y 2 de ellos son falsos, se verá así:

appIds = {id1, id2, null, null};

Mi pregunta es: ¿hay una manera de hacer esto sin que los nulos se pongan allí? ¡Gracias por leer!


Estás buscando la función .filter() :

$scope.appIds = $scope.applicationsHere.filter(function(obj) { return obj.selected; });

Eso producirá una matriz que contiene solo aquellos objetos cuya propiedad "seleccionada" es true (o veraz).

Lo siento, me estaba tomando un café y me perdí los comentarios, sí, como jAndy señaló en un comentario, para filtrar y luego extraer solo los valores de "id", sería:

$scope.appIds = $scope.applicationsHere.filter(function(obj) { return obj.selected; }).map(function(obj) { return obj.id; });

Algunas bibliotecas funcionales (como Functional , que en mi opinión no tienen suficiente cariño) tienen una función .pluck() para extraer valores de propiedades de una lista de objetos, pero JavaScript nativo tiene un conjunto bastante magro de tales herramientas.