Como posso pular um elemento de matriz .map
?
Meu 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;
}
});
Isso retornará:
["img.png", null, "img.png"]
javascript
Ismail
fonte
fonte
img.src
se o resultado da divisão pop! = = json?undefined
seria colocado na matriz, em vez denull
. Não que melhor ...Respostas:
Apenas
.filter()
primeiro:Se você não quiser fazer isso, o que não é irracional, pois tem algum custo, você pode usar o mais geral
.reduce()
. Você geralmente pode expressar.map()
em termos de.reduce
:pode ser escrito como
Portanto, se você precisar pular elementos, poderá fazer isso facilmente com
.reduce()
:Nessa versão, o código
.filter()
do primeiro exemplo faz parte do.reduce()
retorno de chamada. A fonte da imagem é enviada apenas para a matriz de resultados no caso em que a operação de filtro a teria mantido.fonte
.reduce()
e fazer tudo de uma só vez, embora em termos de desempenho duvide que isso faça uma diferença significativa.null
,undefined
,NaN
etc.) que seria bom se pudéssemos utilizar um dentro de ummap()
como um indicador de que este objeto mapeia para nada e deve ser ignorada. Costumo encontrar matrizes que quero mapear 98% de (por exemplo:String.split()
deixar uma única string vazia no final, com a qual não me importo). Obrigado pela sua resposta :).reduce()
é uma função da linha de base "faça o que você quiser", porque você tem controle total sobre o valor de retorno. Você pode estar interessado no excelente trabalho de Rich Hickey em Clojure sobre o conceito de transdutores ..map()
. No entanto, você pode usar.reduce()
, então adicionarei isso.Eu acho que a maneira mais simples de pular alguns elementos de uma matriz é usando o método filter () .
Usando esse método ( ES5 ) e a sintaxe ES6, você pode escrever seu código em uma linha e isso retornará o que você deseja :
fonte
.filter()
foi feito paraforEach
completá-lo em uma passagem em vez de duas?O(n)
complexidade e consulte pelo menos esses dois artigos também: frontendcollisionblog.com/javascript/2015/08/15/… e coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-invés Tudo de bom!Desde 2019, o Array.prototype.flatMap é uma boa opção.
Do MDN :
fonte
TLDR: você pode primeiro filtrar sua matriz e depois executar seu mapa, mas isso exigiria duas passagens na matriz (o filtro retorna uma matriz para mapear). Como essa matriz é pequena, é um custo de desempenho muito pequeno. Você também pode fazer uma simples redução. No entanto, se você quiser repensar como isso pode ser feito com uma única passagem pela matriz (ou qualquer tipo de dados), você pode usar uma idéia chamada "transdutores" popularizada por Rich Hickey.
Responda:
Não devemos exigir o aumento do encadeamento de pontos e a operação na matriz,
[].map(fn1).filter(f2)...
pois essa abordagem cria matrizes intermediárias na memória em todas asreducing
funções.A melhor abordagem opera na função de redução real, para que haja apenas uma passagem de dados e nenhuma matriz extra.
A função redutora é a função passada
reduce
e pega um acumulador e entrada da fonte e retorna algo que se parece com o acumuladorRecursos: pós-transdutores ricos de hickey
fonte
Aqui está uma solução divertida:
Use com o operador de ligação :
fonte
map
,filter
econcat
chamadas.Responda sem casos extremos supérfluos:
fonte
Por que não usar apenas um loop forEach?
Ou filtro de uso ainda mais simples:
fonte
map
vamos mantê-lo como está agora. (era 4yrs atrás eu fiz esta pergunta, quando eu não sabia nada sobre codificação)O
.filter(Boolean)
filtro filtrará quaisquer valores de falsey em um determinado array, que no seu caso é onull
.fonte
Aqui está um método utilitário (compatível com ES5) que mapeia apenas valores não nulos (oculta a chamada para redução):
fonte
Eu uso
.forEach
para iterar, e empurro o resultado para oresults
array e depois o uso. Com esta solução, não repetirei o array duas vezesfonte
Para extrapolar no comentário de Felix Kling , você pode usar
.filter()
assim:Isso removerá os valores falsey da matriz retornada por
.map()
Você poderia simplificá-lo ainda mais assim:
Ou mesmo como uma linha usando uma função de seta, a destruição de objetos e o
&&
operador:fonte
Aqui está uma versão atualizada do código fornecido pelo @theprtk . É um pouco limpo para mostrar a versão generalizada enquanto se tem um exemplo.
Nota: eu adicionaria isso como um comentário em sua postagem, mas ainda não tenho reputação suficiente
fonte
Você pode usar o método depois de você
map()
. O método,filter()
por exemplo, no seu caso:O filtro do método:
Em seguida, apenas os itens existentes estão na nova matriz
sourceFiltered
.fonte