减少计数,以便显示每个用户的所有供应商的计数



我有一个名为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,我的输出对于每个拥有单个供应商的用户都是正确的,但只为具有多个供应商的用户选择第一个。 例如,对于上述内容,Paul 将显示计数为 2,对于 Paul,Sup1 有 2 个客户,Sup2 有 1 个客户。我如何解决这个问题,以便像保罗这样的用户拥有多个供应商?

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),
}));

您可以使用简单的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)

你可以使用 map() 和 length()

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

相关内容

最新更新