¿Cómo puedo omitir un elemento de matriz .map
?
Mi código:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Esto devolverá:
["img.png", null, "img.png"]
javascript
Ismail
fuente
fuente
img.src
si el resultado de la división pop! = = json?undefined
se pondría en la matriz, en lugar denull
. No es mejor ...Respuestas:
Solo
.filter()
es lo primero:Si no desea hacer eso, lo cual no es irrazonable ya que tiene algún costo, puede usar el más general
.reduce()
. Generalmente puede expresarse.map()
en términos de.reduce
:Se puede escribir como
Entonces, si necesita omitir elementos, puede hacerlo fácilmente con
.reduce()
:En esa versión, el código
.filter()
del primer ejemplo es parte de la.reduce()
devolución de llamada. La fuente de la imagen solo se inserta en la matriz de resultados en el caso en que la operación de filtro la hubiera mantenido.fuente
.reduce()
y hacerlo todo de una sola vez, aunque en cuanto al rendimiento, dudo que haga una diferencia significativa.null
,undefined
,NaN
etc) sería bueno si pudiéramos utilizar uno dentro de unamap()
como un indicador de que este objeto se asigna a nada y se debe omitir. A menudo me encuentro con matrices de las que quiero mapear el 98% (por ejemplo,String.split()
dejando una sola cadena vacía al final, lo que no me importa). Gracias por tu respuesta :).reduce()
es una especie de función básica de "haz lo que quieras", porque tienes control total sobre el valor de retorno. Quizás le interese el excelente trabajo de Rich Hickey en Clojure sobre el concepto de transductores ..map()
. Sin embargo, puede usar.reduce()
en su lugar, así que lo agregaré.Creo que la forma más sencilla de omitir algunos elementos de una matriz es mediante el método filter () .
Al usar este método ( ES5 ) y la sintaxis de ES6 , puede escribir su código en una línea , y esto le devolverá lo que desea :
fuente
.filter()
fue hechoforEach
y completarlo en una pasada en lugar de dos?O(n)
medida de complejidad y, al menos, mire también estos dos artículos: frontendcollisionblog.com/javascript/2015/08/15/… y coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-lugar ¡ Todo lo mejor!Desde 2019, Array.prototype.flatMap es una buena opción.
De MDN :
fuente
TLDR: primero puede filtrar su matriz y luego realizar su mapa, pero esto requeriría dos pases en la matriz (el filtro devuelve una matriz al mapa). Como esta matriz es pequeña, es un costo de rendimiento muy pequeño. También puedes hacer una simple reducción. Sin embargo, si desea volver a imaginar cómo se puede hacer esto con un solo paso sobre la matriz (o cualquier tipo de datos), puede usar una idea llamada "transductores" popularizada por Rich Hickey.
Responder:
No deberíamos requerir aumentar el encadenamiento de puntos y operar en la matriz
[].map(fn1).filter(f2)...
ya que este enfoque crea matrices intermedias en la memoria en cadareducing
función.El mejor enfoque opera en la función de reducción real, por lo que solo hay un pase de datos y no hay matrices adicionales.
La función reductora es la función que se pasa
reduce
y toma un acumulador y la entrada de la fuente y devuelve algo que se parece al acumuladorRecursos: ricos transductores de chupetón post
fuente
Aquí hay una solución divertida:
Usar con el operador de enlace :
fuente
map
,filter
yconcat
las llamadas.Responda sin casos extremos superfluos:
fuente
¿Por qué no solo usar un bucle forEach?
O incluso un filtro de uso más simple:
fuente
map
vamos a mantenerlo como está ahora. (hace 4 años hice esta pregunta, cuando no sabía nada sobre codificación)El
.filter(Boolean)
filtrará cualquier valor Falsey en una matriz dada, que en su caso es elnull
.fuente
Aquí hay un método de utilidad (compatible con ES5) que solo asigna valores no nulos (oculta la llamada a reducir):
fuente
Utilizo
.forEach
para iterar, y empujo el resultado a laresults
matriz y luego lo uso, con esta solución no recorreré la matriz dos vecesfuente
Para extrapolar el comentario de Felix Kling , puede usar
.filter()
así:Eso eliminará los valores de falsey de la matriz que devuelve
.map()
Podrías simplificarlo aún más así:
O incluso como una línea utilizando una función de flecha, la desestructuración de objetos y el
&&
operador:fuente
Aquí hay una versión actualizada del código provisto por @theprtk . Se limpia un poco para mostrar la versión generalizada mientras se tiene un ejemplo.
Nota: agregaría esto como un comentario a su publicación, pero todavía no tengo suficiente reputación
fuente
Puede usar después de su método
map()
. El método,filter()
por ejemplo, en su caso:El filtro del método:
Entonces, solo los elementos existentes están en la nueva matriz
sourceFiltered
.fuente