Estive navegando um pouco tentando encontrar uma maneira eficiente de fazer isso, mas não chegamos a lugar algum. Eu tenho uma matriz de objetos que se parece com isso:
array[i].id = some number;
array[i].name = some name;
O que eu quero fazer é encontrar os INDEXES dos objetos em que id é igual a, por exemplo, um de 0,1,2,3 ou 4. Suponho que eu poderia fazer algo como:
var indexes = [];
for(i=0; i<array.length; i++) {
(array[i].id === 0) ? { indexes[0] = i }
(array[i].id === 1) ? { indexes[1] = i }
(array[i].id === 2) ? { indexes[2] = i }
(array[i].id === 3) ? { indexes[3] = i }
(array[i].id === 4) ? { indexes[4] = i }
}
Enquanto isso funcionaria, parece muito caro e lento (para não mencionar feio), especialmente se o array.length puder ser grande. Alguma idéia de como melhorar isso um pouco? Eu pensei em usar array.indexOf de alguma forma, mas não vejo como forçar a sintaxe. este
array.indexOf(this.id === 0);
por exemplo, retorna indefinido, como provavelmente deveria. Desde já, obrigado!
javascript
arrays
indexof
Petrov
fonte
fonte
Array.prototype.findIndex()
no ECMAScript 2015. A resposta aceita foi impressionante.Respostas:
Talvez você queira usar funções de ordem superior, como "mapa". Supondo que você deseja pesquisar pelo atributo 'campo':
fonte
function hashf(el) { return String(el.id) + "_" + String(el.name); }
. Esta é apenas uma dica:elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));
obviamente, a função hash que forneço não é válida para todos os casos, pois'_'
pode fazer parte de seus valores, mas é apenas um exemplo rápido de que você pode descobrir diferentes métodos de hash.indexOf
valor de retorno quando não é possível localizar um determinado valor.map, indexOf
você pode usar apenas um chamadofindIndex
....... Ex:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
A maneira mais simples e fácil de encontrar o índice de elementos na matriz.
Sintaxe ES5:
[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})
Sintaxe ES6:
[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
fonte
findIndex
em developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…obj.id == 3
operador usado aqui pode causar uma conversão inesperada de tipos; portanto, use oobj.id === 3
operador, que testa o mesmo valor e tipo.var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
levou 0,03500000002532033 milissegundos O uso[{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
demorou 0,00999999747378752 milissegundos.O novo método Array .filter () funcionaria bem para isso:
O jQuery também pode fazer isso com .grep ()
edit: vale ressaltar que essas duas funções simplesmente interagem sob o capô, não haverá uma diferença perceptível de desempenho entre elas e a rolagem de sua própria função de filtro, mas por que reinventar a roda.
fonte
Se você se preocupa com o desempenho, não procure ou filtre ou mapeie ou use qualquer um dos métodos discutidos acima
Aqui está um exemplo demonstrando o método mais rápido. AQUI está o link para o teste real
Bloco de instalação
Método mais rápido
Métodos mais lentos
Método mais lento
fonte
o resultado é uma lista de pesquisa para o ID. com o ID fornecido, obtemos o índice do registro.
fonte
fonte
Como não há resposta usando a matriz regular
find
:fonte
Uma nova maneira de usar o ES6
fonte
picked_element
é uma matriz neste caso ...const index = array.findIndex(item => item.id === 'your-id');
Isso deve fornecer o índice do item na matriz com id === your-id
fonte
Parece-me que você poderia criar um iterador simples com um retorno de chamada para teste. Igual a:
Então você poderia invocar assim:
fonte
Adaptando a resposta de Tejs para mongoDB e Robomongo I mudou
para
fonte
Usando a
map
função ES6 :fonte
Para resumir toda a grande resposta acima e adicional da minha resposta em relação a encontrar todos os índices ocorridos em alguns dos comentários.
fonte
Como ainda não posso comentar, quero mostrar a solução que usei com base no método que Umair Ahmed postou, mas quando você deseja procurar uma chave em vez de um valor:
Entendo que ele não responde à pergunta expandida, mas o título não especifica o que era desejado de cada objeto. Por isso, quero compartilhar humildemente isso para economizar dores de cabeça para outras pessoas no futuro, enquanto eu o desinformar, talvez não seja o solução mais rápida.
fonte
Eu criei um pequeno utilitário chamado super-array, onde você pode acessar itens em um array por um identificador exclusivo com complexidade O (1). Exemplo:
fonte
retornará o índice 1 (funciona apenas no ES 2016)
fonte
Eu gosto desse método porque é fácil comparar com qualquer valor no objeto, independentemente da profundidade do aninhamento.
fonte