5

Получить индекс объекта в массиве, соответствующего условию

1501

У меня есть массив следующего вида:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

Как можно получить индекс объекта, который соответствует определенному условию, без перебора всего массива?

Например, если задать условие prop2 == "yutu", я хочу получить индекс 1.

Я видел метод .indexOf(), но, по моему мнению, он используется только для простых массивов, таких как ["a1", "a2", ...]. Я также проверял $.grep(), но он возвращает объекты, а не индексы.

5 ответ(ов)

0

На русском, в стиле ответа на 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.

Если у вас есть дополнительные вопросы по этому коду или потребность в пояснениях, не стесняйтесь обращаться!

0

В вашем примере кода используется метод 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);
  1. arr.map(i => i.prop2): Этот вызов метода map создает новый массив, содержащий только значения prop2 из объектов в массиве arr. Результат будет:

    ["qwe", "yutu", "qwrq"]
    
  2. .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.

0

В данном коде происходит итерация по всем элементам массива 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, тем самым обеспечивая, что при успешном выполнении условия будет возвращено истинное значение.

0

Вы можете использовать метод 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.

0

В вашем коде реализована функция 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.

Если у вас есть какие-то дополнительные вопросы или нужна помощь с оптимизацией, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь