Come posso ottenere l'indice dell'oggetto che corrisponde a una condizione (senza iterare lungo l'array)?
Non è possibile, qualcosa deve scorrere attraverso l'array (almeno una volta).
Se la condizione cambia molto, allora dovrai scorrere e guardare gli oggetti in essa contenuti per vedere se corrispondono alla condizione. Tuttavia, su un sistema con funzionalità ES5 (o se si installa uno shim), tale iterazione può essere eseguita in modo abbastanza conciso:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
Che utilizza la nuova (ish) Array#some
la funzione , che scorre le voci nella matrice finché la funzione si dà restituisce true. La funzione che ho assegnato salva l'indice della voce corrispondente, quindi ritorna true
per interrompere l'iterazione.
O ovviamente, basta usare un for
loop. Le tue varie opzioni di iterazione sono trattate in questa altra risposta .
Ma se utilizzerai sempre la stessa proprietà per questa ricerca e se i valori delle proprietà sono univoci, puoi eseguire il ciclo solo una volta e creare un oggetto per mapparli:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(O, ancora, potresti usare un for
loop o una qualsiasi delle tue altre opzioni .)
Quindi se devi trovare la voce con prop2 = "yutu"
, puoi farlo:
var entry = prop2map["yutu"];
Io chiamo questo "indicizzazione incrociata" dell'array. Naturalmente, se si rimuovono o si aggiungono voci (o si modificano i loro prop2
valori), è necessario aggiornare anche l'oggetto di mappatura.
0
?). Entrambe le soluzioni eseguono più iterazioni del necessario, il che è meno che ideale se l'array è grande (anche se le probabilità che sia così grande che un essere umano noterebbe sono basse, a meno che le ricerche non stiano accadendo molto ).