Как правильно перебрать объекты в массиве с условием и результатом в новый объект?

Есть массив объектов пользоватилей

    [{
      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 шт):

Автор решения: Igor
  for (let i = 0; i < friends.length; i++) {
    ...
    //return result;
  }
  return result;   <--- !!!
→ Ссылка
Автор решения: Alexandr

Вот пример выполнения задачи:

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 прекращаете выполнение функции на первой итерации цикла

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

Логика статусов описана весьма странно - по идее, она должна быть "если статус не оффлайн, то определяем его по значению 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);

Еще один странный момент - это поставленная цель, создание массивов имен... подобное действие ведь лишено практического смысла. Если представить такую задачу в контексте реальной практики, было бы намного разумнее менять состояние, те данные которые уже есть (сами объекты, либо их клоны при требовании иммутабельности). А вот от такого "размазывания" данных по нескольким сущностям которые еще и противоречат друг другу, мы ничего не выигрываем (только привыкаем к очень вредному паттерну).

Конечно, ясно что эта задача учебная - и именно поэтому, я бы посоветовал как можно скорее, как можно дальше бежать от учителей дающих подобное :) Учиться желательно с пользой для себя: осмысленно, понимая что стоит за совершаемыми действиями, и сценарии прикладного применения получаемых знаний. То есть, впитывать не механическое написание кода ради кода (оставляя рассудок где-то за бортом), а подходы к решению задач как основной деятельности. Вот один из примеров полезной практической задачи (просто первое что попалось из поиска) - просто обрати внимание на формулировки вопроса и ответов: какая роль там отводится коду, а какая рассуждениям о логике решения для достижения цели.

→ Ссылка