Получить индекс объекта в массиве, соответствующего условию
У меня есть массив следующего вида:
[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]
Как можно получить индекс объекта, который соответствует определенному условию, без перебора всего массива?
Например, если задать условие prop2 == "yutu"
, я хочу получить индекс 1
.
Я видел метод .indexOf()
, но, по моему мнению, он используется только для простых массивов, таких как ["a1", "a2", ...]
. Я также проверял $.grep()
, но он возвращает объекты, а не индексы.
5 ответ(ов)
На русском, в стиле ответа на StackOverflow, это может выглядеть так:
Чтобы найти индекс элемента в массиве объектов по определённому свойству, можно использовать метод map()
для создания нового массива значений, а затем применить метод indexOf()
для поиска индекса нужного элемента. Вот пример кода:
var CarId = 23;
// Найдем индекс для свойства VehicleId в массиве объектов CarsList
var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId);
Если вам нужно просто найти индекс числа в массиве, можно сделать это более просто:
var numberList = [100, 200, 300, 400, 500];
var index = numberList.indexOf(200); // Вернет 1
Важно помнить, что если значение не найдено в массиве, метод indexOf()
вернет -1
.
Если у вас есть дополнительные вопросы по этому коду или потребность в пояснениях, не стесняйтесь обращаться!
В вашем примере кода используется метод Array.map()
для извлечения значений свойства prop2
из массива объектов, а затем метод Array.indexOf()
для нахождения индекса первого элемента, равного строке "yutu". Давайте разберемся с вашим кодом.
Вот как он выглядит:
const arr = [{
prop1: "abc",
prop2: "qwe"
}, {
prop1: "bnmb",
prop2: "yutu"
}, {
prop1: "zxvz",
prop2: "qwrq"
}];
const index = arr.map(i => i.prop2).indexOf("yutu");
console.log(index);
arr.map(i => i.prop2)
: Этот вызов методаmap
создает новый массив, содержащий только значенияprop2
из объектов в массивеarr
. Результат будет:["qwe", "yutu", "qwrq"]
.indexOf("yutu")
: Затем вызывается методindexOf
, который ищет индекс строки "yutu" в созданном массиве. Он вернет индекс 1, так как "yutu" — это второй элемент в массиве (индексация начинается с 0).
Таким образом, результат выполнения console.log(index)
будет:
1
Если вам нужно получить индекс соответствующего объекта в оригинальном массиве arr
, вы можете воспользоваться методом findIndex
, который позволяет избежать дополнительного создания массива значений. Вот пример:
const index = arr.findIndex(i => i.prop2 === "yutu");
console.log(index); // вывод: 1
Таким образом, findIndex
вернет индекс первого объекта, у которого свойство prop2
равно "yutu", что также даст вам результат 1
.
В данном коде происходит итерация по всем элементам массива yourArray
с использованием метода some
. Если элемент массива удовлетворяет условию elem.prop2 === 'yutu'
, то в переменную index
присваивается индекс этого элемента, и функция возвращает true
. Если ни один элемент не соответствует условию, возвращается false
.
Обратите внимание, что явное возвращение true
(или значение, которое интерпретируется как истинное) имеет важное значение. Обычное присваивание index = i
недостаточно, так как в случае, если индекс равен 0, Boolean(0)
вернет false
. Это не вызовет ошибку, но прекратит итерацию по массиву, что может привести к неожиданным результатам.
В редакции представлена еще более короткая версия этого кода:
yourArray.some(function (elem, i) {
return elem.prop2 === 'yutu' && ~(index = i);
});
Здесь используется битовая операция ~
, которая возвращает значение, не равное -1
, тем самым обеспечивая, что при успешном выполнении условия будет возвращено истинное значение.
Вы можете использовать метод map
, чтобы найти индекс искомого имени студента в массиве объектов. Вот мое объяснение этого подхода на примере данных о студентах.
- Шаг 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);
Полный код выглядит так:
var students = [
{ name: "Rambabu", htno: "1245" },
{ name: "Divya", htno: "1246" },
{ name: "poojitha", htno: "1247" },
{ name: "magitha", htno: "1248" }
];
var studentNameToSearch = "Divya";
var matchedIndex = students.map(function (obj) {
return obj.name;
}).indexOf(studentNameToSearch);
console.log(matchedIndex);
alert("Индекс искомого имени в массиве: " + matchedIndex);
С помощью этого кода вы можете найти индекс имени студента в массиве. Результат будет выведен в консоль и отображён в виде предупреждения. Если имя не найдено, matchedIndex
будет равен -1.
В вашем коде реализована функция findIndexByKeyValue
, которая ищет индекс объекта в массиве по заданному ключу и значению. Она проходит по всем элементам массива и сравнивает значение ключа с переданным значением. Если значение совпадает, функция возвращает индекс элемента, иначе –1.
Вот как работает ваш пример:
function findIndexByKeyValue(_array, key, value) {
for (var i = 0; i < _array.length; i++) {
if (_array[i][key] == value) {
return i; // Возвращает индекс, если найдено совпадение
}
}
return -1; // Возвращает -1, если значение не найдено
}
var a = [
{prop1:"abc", prop2:"qwe"},
{prop1:"bnmb", prop2:"yutu"},
{prop1:"zxvz", prop2:"qwrq"}
];
var index = findIndexByKeyValue(a, 'prop2', 'yutu');
console.log(index); // Выводит 1, так как элемент с prop2 равным 'yutu' находится на индексе 1
Таким образом, для данного массива a
и поиска элемента с ключом prop2
со значением 'yutu'
, функция вернет индекс 1
, что соответствует второму объекту в массиве. Если же вы будете искать значение, которого нет в массиве, функция вернет -1
.
Если у вас есть какие-то дополнительные вопросы или нужна помощь с оптимизацией, не стесняйтесь спрашивать!
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?
Как проверить, пустой ли массив или существует?
Прокрутка к элементу с использованием jQuery
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?