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#somefunçã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 truepara interromper a iteração.
Ou, é claro, basta usar um forloop. 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 forloop 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 prop2valores), 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 ).