Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分组并加下划线求和_Javascript_Underscore.js - Fatal编程技术网

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