Уменьшите счет, чтобы он отображал счет всех поставщиков на пользователя - PullRequest
0 голосов
/ 07 июня 2019

У меня есть этот объект с именем grouped:

{ '1':
   [ { id: 1,
       name: 'John Doe',
       supplierName: 'Sup1',
       count: '21' } ],
  '2':
   [ { id: 2,
       name: 'Jane Doe',
       supplierName: 'Sup1',
       count: '95' } ],
  '3':
   [ { id: 3,
       name: 'Paul',
       supplierName: 'Sup1',
       count: '2' },
     { id: 3,
       name: 'Paul',
       supplierName: 'Sup2',
       count: '1' } 
    ] 
}

Я создаю объект пользователя с этим:

    let users = _.map(grouped, userArray => ({
      id: userArray[0].id,
      name: userArray[0].name,
      suppliers: _.reduce(userArray, (accumulated, supplierObj) => {
        if (supplierObj.supplierName) {
          accumulated.push({
            title: supplierObj.supplierName,
          });
        }
        return accumulated;
      }, []),
    }));

В настоящее время это выглядит так:

{
    "users": [
        {
            "id": 1,
            "name": "John Doe",
            "suppliers": [
                {
                    "title": "Sup1"
                }
            ]
        },{
            "id": 2,
            "name": "Jane Doe",
            "suppliers": [
                {
                    "title": "Sup1"
                }
            ]
        },{
            "id": 3,
            "name": "Paul",
            "suppliers": [
                {
                    "title": "Sup1"
                },{
                    "title": "Sup2"
                }
            ]
        }
    ]
}

Теперь я хочу добавить count таким образом, чтобы мой вывод был таким:

{
    "users": [
        {
            "id": 1,
            "name": "John Doe",
            "count": "21",
            "suppliers": [
                {
                    "title": "Sup1"
                }
            ]
        },{
            "id": 2,
            "name": "Jane Doe",
            "count": "95",
            "suppliers": [
                {
                    "title": "Sup1"
                }
            ]
        },{
            "id": 3,
            "name": "Paul",
            "count": "2",
            "suppliers": [
                {
                    "title": "Sup1"
                },{
                    "title": "Sup2"
                }
            ]
        }
    ]
}

Если я просто добавлю count: userArray[0].count, мой вывод верен для каждого пользователя, у которого есть один поставщик, но выбирает 1-го для любого с более чем одним. Например. Для вышесказанного Пол показал бы счет 2, а для Пола есть 2 клиента для Sup1 и 1 для Sup2. Как это исправить, чтобы пользователи, такие как Пол, имели более одного поставщика?

Ответы [ 3 ]

2 голосов
/ 07 июня 2019
  count: userArray.reduce((sum, user) => sum + +user.count, 0)

Используя .reduce, вы можете суммировать счет.Унарный плюс необходим для преобразования строк в числа.

И вам не нужен lodash, и вам не нужно уменьшать, если вы можете фильтровать и отображать:

  const users = Object.values(grouped).map(users => ({
     id: users[0].id,
     name: users[0].name,
     suppliers: users.map(user => user.supplierName).filter(it => it),
     count: users.reduce((sum, user) => sum + +user.count, 0),
  }));
1 голос
/ 07 июня 2019

Вы можете использовать простые map().И используйте reduce(), чтобы получить count

let obj = { '1': [ { id: 1, name: 'John Doe', supplierName: 'Sup1', count: '21' } ], '2': [ { id: 2, name: 'Jane Doe', supplierName: 'Sup1', count: '95' } ], '3': [ { id: 3, name: 'Paul', supplierName: 'Sup1', count: '2' }, { id: 3, name: 'Paul', supplierName: 'Sup2', count: '1' } ] }

const res = Object.values(obj).map((x) => (
  { 
    id:x[0].id,
    name:x[0].name,
    suppliers:x.map(title => ({title})),
    count:x.reduce((ac,a) => +ac + +a.count, 0)
  }
))
console.log(res)
0 голосов
/ 07 июня 2019

Вы можете использовать карту () и длину ()

users.map(user => ({
...user,
count: user.suppliers.length()
}))
...