O .indexOf()
método tem um segundo parâmetro opcional que especifica o índice a partir do qual iniciar a pesquisa, para que você possa chamá-lo em um loop para encontrar todas as instâncias de um determinado valor:
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var indexes = getAllIndexes(Cars, "Nano");
Você realmente não deixa claro como deseja usar os índices, então minha função os retorna como uma matriz (ou retorna uma matriz vazia se o valor não for encontrado), mas você poderia fazer outra coisa com os valores de índice individuais dentro do loop.
ATUALIZAÇÃO: de acordo com o comentário do VisioN, um loop for simples faria o mesmo trabalho com mais eficiência e é mais fácil de entender e, portanto, mais fácil de manter:
function getAllIndexes(arr, val) {
var indexes = [], i;
for(i = 0; i < arr.length; i++)
if (arr[i] === val)
indexes.push(i);
return indexes;
}
for
loop com preenchimento de matriz de índice..indexOf()
eu queria mostrar que ele pode fazer o trabalho. (Acho que descobri que o OP poderia descobrir como fazê-lo com um loop for.) Claro que existem outras maneiras de fazer isso, por exemplo,Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
indexes
vez deindices
: POutra solução alternativa é usar
Array.prototype.reduce()
:NB: Verifique a compatibilidade do navegador para o
reduce
método e use polyfill se necessário.fonte
:)
Sim, pensei que talvezreduce
pudesse ser uma boa alternativa.array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
contat
é mais lento do quepush
, portanto, fico com a resposta.Outra abordagem usando Array.prototype.map () e Array.prototype.filter () :
fonte
map(…)
verifica em cada iteração a igualdade dee
evalue
. Quando eles correspondem, o índice é retornado, caso contrário, uma string vazia. Para se livrar desses valores falsos,filter(String)
certifique-se de que o resultado contenha apenas valores do tipo string e NÃO vazios.filter(String)
também pode ser escrito como:filter(e => e !== '')
String(thing)
força qualquer coisa a uma string.Array#filter
retorna uma matriz de todos os valores para os quais a condição é verdadeira . Como as strings vazias são falsas , elas NÃO são incluídas na matriz.Maneira mais simples com o estilo es6.
fonte
Você pode escrever uma solução legível simples para isso usando
map
efilter
:EDITAR: Se você não precisa suportar IE / Edge (ou está transpilando seu código), ES2019 nos deu flatMap , que permite fazer isso em uma linha simples:
fonte
Nota: MDN fornece um método usando um loop while :
Eu não diria que é melhor do que outras respostas. Apenas interessante.
fonte
Eu só quero atualizar com outro método fácil.
Você também pode usar o método forEach.
fonte
fonte
Isso funcionou para mim:
fonte
Apenas para compartilhar outro método, você também pode usar Geradores de Função para obter o resultado:
fonte
Podemos usar Stack e inserir "i" na pilha sempre que encontrarmos a condição "arr [i] == value"
Verifique isto:
fonte
javascript
, enquanto sua resposta éJava
eu acredito?fonte
Você pode usar Polyfill
}
Use-o assim:
fonte
findIndex
recupera apenas o primeiro índice que corresponde à saída de retorno de chamada. Você pode implementar seu própriofindIndexes
estendendo Array e, em seguida, convertendo seus arrays para a nova estrutura.fonte
Se você pretende usar sublinhado / lodash, você pode fazer
fonte
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])