Javascript 分组并加下划线求和
输入: 每个属性(数量除外)都应分组<代码>数量。应汇总长度值。还应添加Javascript 分组并加下划线求和,javascript,underscore.js,Javascript,Underscore.js,输入: 每个属性(数量除外)都应分组数量。应汇总长度值。还应添加count属性 预期产出: const data = [ { id: 'RS11', name: 'Road 1', quantity: { lengthVal: 50 } }, { id: 'RS11', name: 'Road 1', quantity: { lengthVal: 100 } }, { id: '
count
属性
预期产出:
const data = [
{
id: 'RS11',
name: 'Road 1',
quantity: {
lengthVal: 50
}
},
{
id: 'RS11',
name: 'Road 1',
quantity: {
lengthVal: 100
}
},
{
id: 'RS11',
name: 'Road 2',
quantity: {
lengthVal: 20
}
}
]
这就是我所尝试的:
const expected = [
{
id: 'RS11',
name: 'Road 1',
count: 2,
summarizedLength: 150
},
{
id: 'RS11',
name: 'Road 2',
count: 1,
summarizedLength: 20
}
]
Jsbin:
数据集非常大,因此性能非常重要。可以通过相当简单的原生reduce()实现这一点,该方法只需对整个过程的数组进行一次迭代
const res=Object.values(
数据减少((a,c)=>{
const key=c.id+“|”+c.name;
常数o=a[key]=a[key]|c;
o、 计数=(o.count | | 0)+1;
o、 SummaredLength=(o.SummaredLength | | 0)+c.quantity.lengthVal;
删除c.数量;
返回a;
},{})
);
console.log(res)
。作为控制台包装{最大高度:100%!重要;}
常数数据=[{
id:'RS11',
名称:"一号公路",,
数量:{
长度:50
}
},
{
id:'RS11',
名称:"一号公路",,
数量:{
长度:100
}
},
{
id:'RS11',
名称:"二号公路",,
数量:{
长度:20
}
}
]
差不多了!“每个属性”是指除数量以外的所有属性。所以除了“id”和“name”之外,还可以有其他属性。好吧……很简单。将其修改为使用现有对象并删除质量
const groupAndSum = (arr) => {
return _.chain(arr)
.groupBy((obj) => {
// Some reduce here?
return _.values(_.without(obj), 'quantity').join('|')
})
.map((val) => {
val[0].count = val.length;
delete val[0].quantity;
return val[0];
})
.value();
}