Como posso obter o índice do objeto que corresponde a uma condição (sem iterar ao longo da matriz)?
Você 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:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
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 retorna true
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:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(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:
var entry = prop2map["yutu"];
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.
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 ).