Как получить следующий вывод из этого массива объектов? - PullRequest
0 голосов
/ 10 ноября 2018

Это оригинальный массив объектов:

const input = [

    {firstProperty: 'something', 
    money: 3, 
    user: 'john-smith'}, 
    {firstProperty: 'somethingDiff', 
    money: 7, 
    user: 'john-smith'}, 
    {firstProperty: 'somElse', 
    money: 14, 
    user: 'jane-doe'},
    {firstProperty: 'someOtherThing', 
    money: 2, 
    user: 'jane-doe'}]

И мне нужно вывести следующее:

const output = [
{user: 'john-smith',
totalMoney: 10},
{user: 'jane-doe',
totalMoney: 16}]

Я уже достиг этого результата, используя кучу циклов for, но я искал элегантное решение, которое использует только методы ES6, такие как map, filter, Reduce и т. Д.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вы также можете использовать подход «Array.reduce» и «Array.from» ниже

var input = [{firstProperty: 'something', money: 3, user: 'john-smith'}, {firstProperty: 'somethingDiff', money: 7, user: 'john-smith'}, {firstProperty: 'somElse', money: 14, user: 'jane-doe'},{firstProperty: 'someOtherThing', money: 2, user: 'jane-doe'}]

var result = Array.from(input.reduce((m, { user, money }) => 
					         m.set(user, { user, totalMoney: (m.get(user) && m.get(user).totalMoney || 0) + money })
					       , new Map)
		      , ([ _, d ]) => d)
       
       
       
console.log(result)
0 голосов
/ 10 ноября 2018

Благодаря обновленному коду вам будет еще проще получить ваш результат. Мой подход все равно будет сначала агрегировать, а затем отображать.

Я обновлял код в соответствии с изменениями в исходном сообщении.

const input = [
    {firstProperty: 'something', 
    money: 3, 
    user: 'john-smith'}, 
    {firstProperty: 'somethingDiff', 
    money: 7, 
    user: 'john-smith'}, 
    {firstProperty: 'somElse', 
    money: 14, 
    user: 'jane-doe'},
    {firstProperty: 'someOtherThing', 
    money: 2, 
    user: 'jane-doe'}
];

function sumByUser( input ) {
  // first aggregate the money per user
  const moneyByUser = input.reduce( (current, { user, money }) => {
    current[user] = (current[user] || 0) + money;
    return current;
  }, {} );
  
  // then create an array by using the keys for user names
  return Object
    .keys( moneyByUser )
    .map( user => ({ user, money: moneyByUser[user] }) );
}

console.log( sumByUser( input ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...