Подскажите как перебрать массив объектов

Подскажите как лучше перебрать такой массив объектов, чтобы в итоговую переменную сохранились только уникальные user_id (в виде массива id)?

Имеем такого вида объект:

{
    21: [{id: 1, user_id: 1}, {id: 2, user_id: 2}],
    45: [{id: 3, user_id: 2}, {id: 4, user_id: 3}],
}

В итоге должно получиться что-то типа того console.log(ids); // [1, 2, 3]

Использую ES6, jquery не использую.


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

Автор решения: Aziz Umarov

Можно так

let arr = {
    21: [{id: 1, user_id: 1}, {id: 2, user_id: 2}],
    45: [{id: 3, user_id: 2}, {id: 4, user_id: 3}],
};

let result = [...Object.values(arr).reduce( (acc, subArray)=>{ subArray.forEach(item=>acc.add(item.user_id)); return acc}, new Set([]))];

console.log(result);

или по короче

let arr = {
    21: [{id: 1, user_id: 1}, {id: 2, user_id: 2}],
    45: [{id: 3, user_id: 2}, {id: 4, user_id: 3}],
};

let result = [...Object.values(arr).reduce((a,s)=>(s.forEach(i=>a.add(i.user_id)),a),new Set())];

console.log(result);

или без reduce ещё короче

let arr = {
    21: [{id: 1, user_id: 1}, {id: 2, user_id: 2}],
    45: [{id: 3, user_id: 2}, {id: 4, user_id: 3}],
};

let result = [...new Set(Object.values(arr).map(s=>s.map(i=>i.user_id)).flat())];

console.log(result);

→ Ссылка
Автор решения: Bear Vorkuta

let ids = new Set()
let obj = {
   21: [{id: 1, user_id: 1}, {id: 2, user_id: 2}],
   45: [{id: 3, user_id: 2}, {id: 4, user_id: 3}],
}

for (let key in obj)
{
   obj[key].forEach(el => ids.add(el.user_id))
}

console.log(Array.from(ids))

→ Ссылка