Tengo una matriz de objetos que quiero iterar para producir una nueva matriz filtrada. Pero también, necesito filtrar algunos de los objetos de la nueva matriz dependiendo de un parámetro. Estoy intentando esto:
function renderOptions(options) {
return options.map(function (option) {
if (!option.assigned) {
return (someNewObject);
}
});
}
¿Es ese un buen enfoque? hay algun metodo mejor? Estoy abierto a usar cualquier biblioteca como lodash.
javascript
arrays
Daniel Calderon Mori
fuente
fuente
.reduce()
es definitivamente más rápido que hacer.filter(...).map(...)
lo que he visto sugerido en otra parte. Configuré una prueba JSPerf para demostrar stackoverflow.com/a/47877054/2379922Respuestas:
Deberías usar
Array.reduce
para esto.Alternativamente, el reductor puede ser una función pura, como esta
fuente
filtered
es un objeto. asífiltered.push
que no está definido para mí.filtered
ser un objeto. Esto se debió a que no estaba pasando el "valor inicial": la matriz vacía ([]
) después de la función de reducción. ej. incorrectovar reduced = options.reduce(function(filtered, option) { ... });
correctovar reduced = options.reduce(function(filtered, option) { ... }, []);
reduce
esto, también podría usarloforEach
ya que en cada iteración cambia la matrizfiltered
y, por lo tanto, no es puramente funcional. Sería un evento más legible y compacto.¡Usa reducir, Luke!
fuente
Desde 2019, Array.prototype.flatMap es una buena opción.
Desde la página MDN vinculada anteriormente:
fuente
flatMap
se introdujo recientemente y su soporte de navegador es limitado . Es posible que desee utilizar los polyfill / shims oficiales: flatMap y flat .Con ES6 puedes hacerlo muy corto:
options.filter(opt => !opt.assigned).map(opt => someNewObject)
fuente
¡Una línea
reduce
con la sintaxis elegante de ES6 está aquí!fuente
result
... es como unafilter(assigned).map(name)
solución...assigned ? [name] : []
, puede ser más legible como...(assigned ? [name] : [])
Haría un comentario, pero no tengo la reputación requerida. Una pequeña mejora a la muy buena respuesta de Maxim Kuzmin para que sea más eficiente:
Explicación
En lugar de distribuir el resultado completo una y otra vez para cada iteración, solo agregamos a la matriz, y solo cuando realmente hay un valor para insertar.
fuente
Utilice Array.prototy.filter en sí
fuente
En algún momento, ¿no es más fácil (o igual de fácil) usar un
forEach
Sin embargo, sería bueno si hubiera una función
malter()
ofap()
que combine las funcionesmap
yfilter
. Funcionaría como un filtro, excepto que en lugar de devolver verdadero o falso, devolvería cualquier objeto o un valor nulo / indefinido.fuente
Optimicé las respuestas con los siguientes puntos:
if (cond) { stmt; }
comocond && stmt;
Presentaré dos soluciones, una usando forEach , la otra usando reduce :
Solución 1: uso de forEach
Solución 2: usando reduce
Te dejo a ti decidir qué solución elegir.
fuente
cond && stmt;
? Esto es mucho más difícil de leer y no ofrece ningún beneficio.Usando reduce, puede hacer esto en una función Array.prototype. Esto buscará todos los números pares de una matriz.
Puede usar el mismo método y generalizarlo para sus objetos, de esta manera.
arr
ahora contendrá los objetos filtrados.fuente
El uso directo de
.reduce
puede ser difícil de leer, por lo que recomiendo crear una función que genere el reductor para usted:Úselo así:
fuente