Как я могу получить индекс объекта, который соответствует условию (без итерации по массиву)?
Вы не можете, что-то должен перебирать массив (по крайней мере, один раз).
Если состояние сильно изменилось, вам придется пройтись и посмотреть на объекты в нем, чтобы увидеть, соответствуют ли они условию. Однако, в системе с функциями ES5 (или если вы установите подкладку), что итерация может быть сделана достаточно лаконично:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
Это использует новый (МОГ) Array#some
function, который перебирает записи в массиве, пока функция, которую вы ему даете, возвращает true. Функция, которую я ему предоставил, сохраняет индекс соответствующей записи, а затем возвращает true
, чтобы остановить итерацию.
Или, конечно, просто используйте петлю for
. Различные варианты итераций описаны в this other answer.
Но если вы всегда будете использовать такое же свойство для этого поиска, и если значение свойств являются уникальным, вы можете цикл только один раз и создать объект для отображения их:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(. или, опять же, вы можете использовать for
петлю или любой из your other options)
Тогда, если вам нужно найти запись с prop2 = "yutu"
, вы можете сделать это:
var entry = prop2map["yutu"];
Я называю это «кросс-индексирование» массива. Естественно, если вы удаляете или добавляете записи (или изменяете их значения prop2
), вам также необходимо обновить свой объект сопоставления.
Я не вижу необходимости в временном массиве здесь. Просто используйте тот факт, что функция итератора закрывается по контексту и использует переменную. Кроме того, версия не-jQuery не работает (предположим, что она найдена в индексе '0'?). * Оба решения имеют больше итераций, чем требуется, что является менее идеальным, если массив большой (хотя вероятность того, что он будет настолько большой, что человек заметит, низкий, если только поисковые запросы не происходят ** много **). –
@ T.J.Crowder: не-jQuery версия исправлена, спасибо. – georg
@ thg435: По-прежнему думаю, что это немного машина Рубе Голдберга, где простой рычаг мог бы сделать трюк. :-) Но эй, это работает! –