У меня есть такой массив:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Как я могу получить индекс объекта, который соответствует условию, без итерации по всему массиву?
Например, учитывая prop2=="yutu"
, я хочу получить индекс 1
.
Я видел, .indexOf()
но думаю, что он используется для простых массивов, как ["a1","a2",...]
. Я также проверил, $.grep()
но это возвращает объекты, а не индекс.
источник
0
?). Оба решения выполняют больше итераций, чем требуется, что не идеально, если массив большой (хотя вероятность того, что он будет настолько большим, что человек заметит, низка, если поиск не происходит много ).x => x.prop2=="yutu"
работает с findIndex ()?function(x) { return x.prop2=="yutu" }
index = a.findIndex(function (x) { return x.prop2 == "yutu" })
исправленный вопрос, так что с помощью кода polyfill findIndex работал в IE11Вы не можете, что-то должно пройти через массив (хотя бы один раз).
Если условие сильно меняется, то вам придется пройтись по нему и посмотреть на объекты в нем, чтобы увидеть, соответствуют ли они условию. Однако в системе с функциями ES5 (или если вы устанавливаете прокладку) эту итерацию можно сделать довольно кратко:
При этом используется новая
Array#some
функция (ish) , которая перебирает записи в массиве до тех пор, пока функция, которую вы ей дадите, не вернет true. Функция, которую я дал, сохраняет индекс соответствующей записи, а затем возвращает,true
чтобы остановить итерацию.Или, конечно, просто используйте
for
цикл. Различные варианты итерации описаны в этом другом ответе .Но если вы всегда собираетесь использовать одно и то же свойство для этого поиска, и если значения свойств уникальны, вы можете выполнить цикл только один раз и создать объект для их отображения:
(Или, опять же, вы можете использовать
for
цикл или любой другой вариант .)Затем, если вам нужно найти запись с помощью
prop2 = "yutu"
, вы можете сделать это:Я называю это «перекрестной индексацией» массива. Естественно, если вы удаляете или добавляете записи (или изменяете их
prop2
значения), вам также необходимо обновить объект сопоставления.источник
thg435
сделало то, что я хотел ...Как сказал TJ Crowder, каждый раз будет иметь какую-то скрытую итерацию, с lodash это становится:
источник
И для базовых номеров массивов вы также можете сделать это:
Вы получите -1, если не сможете найти значение в массиве.
источник
Итерировать по всем элементам массива. Возвращает индекс и true или false, если условие не совпадает.
Важным является явное возвращаемое значение true (или значение, логический результат которого равен true). Одного присваивания недостаточно из-за возможного индекса с 0 (Boolean (0) === false), который не приведет к ошибке, но отключит разрыв итерации.
редактировать
Еще более короткая версия вышеупомянутого:
источник
|
оператор NOT , это короткая версия получения из индекса (с -1) истинного / ложного результата, если индекс существует.~
него так не работает.!!(index = 0)
и!!~(index = 0)
разница действительно. Спасибо!Вы можете использовать Array.prototype.some () следующим образом (как указано в других ответах):
https://jsfiddle.net/h1d69exj/2/
источник
Я видел много решений в выше.
Здесь я использую функцию карты, чтобы найти индекс поискового текста в объекте массива.
Я собираюсь объяснить свой ответ с использованием данных студентов.
Шаг 1 : создайте объект массива для студентов (необязательно, вы можете создать свой собственный объект массива).
var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];
шаг 2 : создайте переменную для поиска текста
var studentNameToSearch = "Divya";
Шаг 3 : Создайте переменную для хранения сопоставленного индекса (здесь мы используем функцию map для итерации).
var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);
источник
источник
Почему вы не хотите повторять точно? Новый Array.prototype.forEach отлично подходит для этой цели!
Вы можете использовать Бинарное дерево поиска, чтобы найти с помощью одного вызова метода, если хотите. Это аккуратная реализация BTree и Красно-черного дерева поиска в JS - https://github.com/vadimg/js_bintrees - но я не уверен, сможете ли вы одновременно найти индекс.
источник
Один шаг с использованием Array.reduce () - без jQuery
вернется,
null
если индекс не был найден.источник
источник
Георг уже упоминал, что ES6 имеет Array.findIndex для этого. И некоторые другие ответы обходятся для ES5 с использованием метода Array.some.
Еще один элегантный подход может быть
В то же время я хотел бы подчеркнуть, что Array.some может быть реализован с помощью двоичного или другого эффективного метода поиска. Таким образом, он может работать лучше для цикла в некоторых браузерах.
источник
Попробуйте этот код
источник