Как я могу получить индекс объекта, который соответствует условию (без итерации по массиву)?
Вы не можете, что-то должно пройти через массив (хотя бы один раз).
Если условие сильно меняется, то вам придется пройтись по нему и посмотреть на объекты в нем, чтобы увидеть, соответствуют ли они условию. Однако в системе с функциями ES5 (или если вы устанавливаете прокладку) эту итерацию можно сделать довольно кратко:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
При этом используется новая Array#someфункция (ish) , которая перебирает записи в массиве до тех пор, пока функция, которую вы ей дадите, не вернет true. Функция, которую я дал, сохраняет индекс соответствующей записи, а затем возвращает, trueчтобы остановить итерацию.
Или, конечно, просто используйте forцикл. Различные варианты итерации описаны в этом другом ответе .
Но если вы всегда собираетесь использовать одно и то же свойство для этого поиска, и если значения свойств уникальны, вы можете выполнить цикл только один раз и создать объект для их отображения:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(Или, опять же, вы можете использовать forцикл или любой другой вариант .)
Затем, если вам нужно найти запись с помощью prop2 = "yutu", вы можете сделать это:
var entry = prop2map["yutu"];
Я называю это «перекрестной индексацией» массива. Естественно, если вы удаляете или добавляете записи (или изменяете их prop2значения), вам также необходимо обновить объект сопоставления.
0?). Оба решения выполняют больше итераций, чем требуется, что не идеально, если массив большой (хотя вероятность того, что он будет настолько большим, что человек заметит, низка, если поиск не происходит много ).