Задать вопрос

Как найти последний элемент массива с нужный свойством?

Мне нужно получить последний элемент массива, который имеет свойство glob_id. Данное свойство нужно записать в переменную.
Я сделал это так, но мне кажется, это не совсем производительно и есть решение получше.
https://jsfiddle.net/3jmuavbo/9/
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
сделал это так, но мне кажется, это не совсем производительно и есть решение получше

"Производительно" далеко не всегда значит "лучше". Бывает так, что производительностью можно пренебречь в пользу краткости и читаемости (шутка, являются ли варианты ниже более читаемыми, вопрос спорный). Код - он не только для компьютеров, но и для людей.

Вот, смотрите - одна строка вместо шести ваших:

const lastId = arr.reduce((id, n) => n.glob_id || id, null);
// или
const lastId = (arr.filter(n => n.glob_id).pop() || {}).glob_id;
// или
const lastId = ([...arr].reverse().find(n => n.glob_id) || {}).glob_id;
// или
const lastId = arr.map(n => n.glob_id).filter(Boolean).pop();

Ну а если говорить более серьёзно, то можно перебирать массив от конца к началу, и прерывать цикл после того, как будет обнаружен первый подходящий элемент:

let lastId = null;
for (let i = arr.length; i--;) {
  if (arr[i].glob_id) {
    lastId = arr[i].glob_id;
    break;
  }
}

UPD. Наконец-то подъехал метод, позволяющий решить задачу и коротко, и без стояния на голове. И трёх с половиной лет ждать не пришлось:

const lastId = arr.findLast(n => n.glob_id)?.glob_id;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BarryHAllen
Если вас интересует именно производительность, то for loop обычно быстрее. значительно.
Хотя результат сильно зависит от целей исходных данных.
немножко тестов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы