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

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

Доброго времени суток! Помогите разобраться. Никак не могу получить результат. Знаю, что надо это делать через reduce, но у меня с ним постоянно возникают сложности

Есть массив и объект:

const items = [
  {
    id: 2,
    price: 40000
  },
  {
    id: 3,
    price: 40000
  },
  {
    id: 4,
    price: 40000
  },
  {
    id: 5,
    price: 40000
  },
  {
    id: 2,
    price: 40000
  },
  {
    id: 3,
    price: 40000
  }
]

const obj = {
  2: 'first',
  3: 'second'
}


Мне нужно на выходе получить следующий результат:

const output = {
  first: 80000,
  second: 80000,
  total: 160000
}


Т.е. пройтись по массиву, взять только по 2 и 3 id , в first записать сумму всех найденных записей с id 2, в second сумму всех найденных с id 3, а в total записать сумму общую по 2 и 3 id

Не понимаю как просуммировать price и еще в объекте откуда-то undefined:

const output = items.reduce((acc, { id, price }) => {
                return {
                    ...acc,
                    [obj[id]]: acc[obj[id]] +=price
                };
            }, {});
  • Вопрос задан
  • 66 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
const out = items.reduce((acc, {id, price}) => {
  const key = obj[id]
  if (key) { // проверяем что элемент с таким id нас вообще интересует
    if (acc[key]) { // если он встречался ранее, то добавляем к текущему значению
      acc[key] += price
    } else { // иначе запоминаем с текущей ценой
      acc[key] = price
    }
    acc.total += price // и всегда добавляем к total
  }
  return acc
}, { total: 0 })
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Наскоро, так:
const output = Object.fromEntries(Object.values(obj).map(name => [name, 0]));

items.forEach(({ id, price }) => {
  if (!Object.hasOwn(obj, id)) return;
  output[obj[id]] += price;
});

output.total = Object.values(output).reduce((acc, c) => acc + c);
// { first: 80000, second: 80000, total: 160000 }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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