Как правильно перебрать объекты в массиве с условием и результатом в новый объект?
Есть массив объектов пользоватилей
[{
username: 'Alice',
status: 'online',
lastActivity: 10
}, {
username: 'Lucy',
status: 'offline',
lastActivity: 22
}, {
username: 'Bob',
status: 'online',
lastActivity: 104
}]
из него нужно получить новый объект в котором перечислено, кто из пользователей онлайн или оффлайн, или если lastActivity > 10, то статус away.
{
online: ['Alice'],
offline: ['Lucy'],
away: ['Bob']
}
Ниже мой код, но он добавляет только одно значение и дальше не идёт, помогите разобраться в чем проблема.
function whoIsOnline(friends) {
const result = {
online: [],
offline: [],
away: [],
};
for (let i = 0; i < friends.length; i++) {
if (friends[i].status === 'online') {
result.online.push(friends[i].username);
}
if (friends[i].status === 'offline') {
result.offline.push(friends[i].username);
}
if (friends[i].lastActivity > 10) {
result.away.push(friends[i].username)
}
return result;
}
}
Ответы (3 шт):
for (let i = 0; i < friends.length; i++) {
...
//return result;
}
return result; <--- !!!
Вот пример выполнения задачи:
let data = [{
username: 'Alice',
status: 'online',
lastActivity: 10
}, {
username: 'Lucy',
status: 'offline',
lastActivity: 22
}, {
username: 'Bob',
status: 'online',
lastActivity: 104
}]
let result = {
online: [],
offline: [],
away: []
}
data.forEach(item => {
if (item.status == 'online'){
item.lastActivity <= 10 ? result.online.push(item.username) : result.away.push(item.username)
} else if(item.status == 'offline'){
result.offline.push(item.username)
}
})
console.log(result)
В вашем примере вы через return прекращаете выполнение функции на первой итерации цикла
Логика статусов описана весьма странно - по идее, она должна быть "если статус не оффлайн, то определяем его по значению lastActivity". То есть, с переходом в онлайн при недавней активности:
const data = [
{
username: 'Alice',
status: 'online',
lastActivity: 10,
}, {
username: 'Lucy',
status: 'offline',
lastActivity: 22,
}, {
username: 'Bob',
status: 'online',
lastActivity: 104,
},
];
const result = data.reduce((rslt, itm) => {
const status = (itm.status === 'offline') ? 'offline'
: (itm.lastActivity > 10) ? 'away' : 'online';
rslt[status]?.push(itm.username);
return rslt;
}, {
online: [],
offline: [],
away: [],
});
console.log(result);
Еще один странный момент - это поставленная цель, создание массивов имен... подобное действие ведь лишено практического смысла. Если представить такую задачу в контексте реальной практики, было бы намного разумнее менять состояние, те данные которые уже есть (сами объекты, либо их клоны при требовании иммутабельности). А вот от такого "размазывания" данных по нескольким сущностям которые еще и противоречат друг другу, мы ничего не выигрываем (только привыкаем к очень вредному паттерну).
Конечно, ясно что эта задача учебная - и именно поэтому, я бы посоветовал как можно скорее, как можно дальше бежать от учителей дающих подобное :) Учиться желательно с пользой для себя: осмысленно, понимая что стоит за совершаемыми действиями, и сценарии прикладного применения получаемых знаний. То есть, впитывать не механическое написание кода ради кода (оставляя рассудок где-то за бортом), а подходы к решению задач как основной деятельности. Вот один из примеров полезной практической задачи (просто первое что попалось из поиска) - просто обрати внимание на формулировки вопроса и ответов: какая роль там отводится коду, а какая рассуждениям о логике решения для достижения цели.