Eu tenho uma matriz como esta:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Como posso obter o índice do objeto que corresponde a uma condição, sem iterar por toda a matriz?
Por exemplo, dado prop2=="yutu"
, eu quero obter o índice 1
.
Eu vi, .indexOf()
mas acho que é usado para matrizes simples como ["a1","a2",...]
. Eu também verifiquei, $.grep()
mas isso retorna objetos, não o índice.
fonte
0
?). Ambas as soluções fazem mais iterações do que o necessário, o que é menos que o ideal se a matriz for grande (embora as chances de ser tão grande que um ser humano notaria sejam baixas, a menos que as pesquisas estejam acontecendo muito ).x => x.prop2=="yutu"
funciona o findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
corrigiu o problema para que, com o código de polyfill, FindIndex trabalhou no IE11Você não pode, algo precisa percorrer a matriz (pelo menos uma vez).
Se a condição mudar muito, você terá que percorrer e examinar os objetos nele para ver se eles correspondem à condição. No entanto, em um sistema com recursos do ES5 (ou se você instalar um shim), essa iteração pode ser feita de forma bastante concisa:
Isso usa a nova
Array#some
função (ish) , que percorre as entradas na matriz até que a função que você fornece retorne true. A função que forneci salva o índice da entrada correspondente e retornatrue
para interromper a iteração.Ou, é claro, basta usar um
for
loop. Suas várias opções de iteração são abordadas nesta outra resposta .Mas se você sempre usará a mesma propriedade para esta pesquisa e se os valores da propriedade forem únicos, poderá fazer um loop apenas uma vez e criar um objeto para mapeá-los:
(Ou, novamente, você pode usar um
for
loop ou qualquer outra opção .)Então, se você precisar encontrar a entrada com
prop2 = "yutu"
, poderá fazer o seguinte:Eu chamo isso de "indexação cruzada" de matriz. Naturalmente, se você remover ou adicionar entradas (ou alterar seus
prop2
valores), também precisará atualizar seu objeto de mapeamento.fonte
thg435
fazia o que eu queria ...O que TJ Crowder disse, de qualquer forma, terá algum tipo de iteração oculta, com lodash isso se torna:
fonte
E para números de matriz básicos, você também pode fazer isso:
Você receberá -1 se não conseguir encontrar um valor na matriz.
fonte
Iterar sobre todos os elementos da matriz. Retorna o índice e true ou false se a condição não corresponder.
Importante é o valor de retorno explícito de true (ou um valor cujo resultado booleano seja verdadeiro). A atribuição única não é suficiente, devido a um possível índice com 0 (Boolean (0) === false), que não resultaria em erro, mas desativa a interrupção da iteração.
Editar
Uma versão ainda mais curta do anterior:
fonte
|
operador, que é uma versão curta de obtenção de um índice (com 1) um truthy / Falsas resultado, se existe um índice.~
ela não funciona assim.!!(index = 0)
e!!~(index = 0)
diferença mesmo. Obrigado!Você pode usar o Array.prototype.some () da seguinte maneira (conforme mencionado nas outras respostas):
https://jsfiddle.net/h1d69exj/2/
fonte
Eu já vi muitas soluções acima.
Aqui estou usando a função map para encontrar o índice do texto de pesquisa em um objeto de matriz.
Vou explicar minha resposta usando os dados dos alunos.
passo 1 : crie um objeto de matriz para os alunos (opcional, você pode criar seu próprio objeto de matriz).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
etapa 2 : criar variável para pesquisar texto
var studentNameToSearch = "Divya";
Etapa 3 : Crie uma variável para armazenar o índice correspondente (aqui usamos a função map para iterar).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
fonte
fonte
Por que você não deseja iterar exatamente? Os novos Array.prototype.forEach são ótimos para essa finalidade!
Você pode usar uma Árvore de Pesquisa Binária para encontrar através de uma única chamada de método, se desejar. Esta é uma implementação pura da árvore de pesquisa BTree e Red black em JS - https://github.com/vadimg/js_bintrees - mas não tenho certeza se você pode encontrar o índice ao mesmo tempo.
fonte
Uma etapa usando Array.reduce () - sem jQuery
retornará
null
se o índice não foi encontrado.fonte
fonte
Georg já mencionou que o ES6 possui Array.findIndex para isso. E algumas outras respostas são uma solução alternativa para o ES5 usando o método Array.some.
Uma abordagem mais elegante pode ser
Ao mesmo tempo, gostaria de enfatizar que o Array.some pode ser implementado com uma técnica de pesquisa binária ou outra eficiente. Portanto, ele pode ter um desempenho melhor em loop em algum navegador.
fonte
Experimente este código
fonte