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

У меня есть 2 массива, один с idшниками, в другом объекты с айдишником и именем которое предназначено для этого айдишника:

const arr1 = [11, 15, 33];
const arr2 = [{id: 11, name: 'name11'}, {id: 15, name: 'name15'}, {id: 33, name: 'name33'}];

Как вернуть массив с именами из arr2, по айдишникам из arr1?

Мой вариант (рабочий):

 const result = arr2.filter((el) => arr1.find((id) => id === el.id)).map((el) => el.name);

Возможно это можно сделать с меншим числом итераций, мне кажеться это не очень хороший вариант с точки зрения оптимизации (если будет много елементов в массивах) ?


Ответы (2 шт):

Автор решения: Yugofx

Ваш алгоритм хорош, в принципе - O(nm). Можно сделать в O(n + m). Чуть больше памяти в процессе выполнения займет, зато сложность линейная.

const keys = {};
arr1.forEach(key => keys[key] = null);
const result = arr2.reduce((names, obj) => {
    if (obj.id in keys) {
        names.push(obj.name);
    }
    return names;
}, []);
→ Ссылка
Автор решения: Dmitrii Sedov

Можно так например:

const arr1 = [11, 15, 33];
const arr2 = [{id: 11, name: 'name11'}, {id: 15, name: 'name15'}, {id: 33, name: 'name33'}];

const result = arr2.flatMap(item => (arr1.includes(item.id) ? [item.name] : []))
console.log(result)

→ Ссылка