Получить индекс объекта в массиве, соответствующего условию
У меня есть массив следующего вида:
[{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?
Как перенаправить на другую веб-страницу?
Как проверить, содержит ли массив строку в TypeScript?