Javascript 基于对象数组中的两个其他值将值转换为百分比

Javascript 基于对象数组中的两个其他值将值转换为百分比,javascript,jquery,arrays,object,ecmascript-6,Javascript,Jquery,Arrays,Object,Ecmascript 6,我有一个对象数组: let data = [ {date:'2018-01-01', device: 'iphone', site: 'google', val1:10, val2:20, val3:30}, {date:'2018-01-01', device: 'iphone', site: 'bing', val1:23, val2:12, val3:14}, {date:'2018-01-01', device: 'iphone', site: 'jeeves

我有一个对象数组:

let data = [
  {date:'2018-01-01', device: 'iphone',   site: 'google', val1:10, val2:20, val3:30},
  {date:'2018-01-01', device: 'iphone',   site: 'bing',   val1:23, val2:12, val3:14},
  {date:'2018-01-01', device: 'iphone',   site: 'jeeves', val1:67, val2:78, val3:12},
  {date:'2018-01-01', device: 'ipad',     site: 'google', val1:10, val2:20, val3:30},
  {date:'2018-01-01', device: 'ipad',     site: 'bing',   val1:23, val2:12, val3:14},
  {date:'2018-01-01', device: 'ipad',     site: 'jeeves', val1:67, val2:78, val3:12},
  {date:'2018-01-02', device: 'iphone',   site: 'google', val1:11, val2:22, val3:33},
  {date:'2018-01-02', device: 'iphone',   site: 'bing',   val1:25, val2:27, val3:28},
  {date:'2018-01-02', device: 'iphone',   site: 'jeeves', val1:67, val2:80, val3:15},
  {date:'2018-01-02', device: 'ipad',     site: 'google', val1:12, val2:21, val3:31},
  {date:'2018-01-02', device: 'ipad',     site: 'bing',   val1:26, val2:16, val3:11},
  {date:'2018-01-02', device: 'ipad',     site: 'jeeves', val1:65, val2:79, val3:55},
  {date:'2018-01-03', device: 'iphone',   site: 'google', val1:17, val2:19, val3:11},
  {date:'2018-01-03', device: 'iphone',   site: 'bing',   val1:13, val2:15, val3:12},
  {date:'2018-01-03', device: 'iphone',   site: 'jeeves', val1:69, val2:79, val3:15},
  {date:'2018-01-03', device: 'ipad',     site: 'google', val1:17, val2:51, val3:31},
  {date:'2018-01-03', device: 'ipad',     site: 'bing',   val1:25, val2:15, val3:17},
  {date:'2018-01-03', device: 'ipad',     site: 'jeeves', val1:61, val2:71, val3:15}
]
我想将
val1
转换为基于日期和设备的百分比

因此,如果设备是iphone,我希望VAL为例如:val1为
10%
23%
67%

到目前为止,我的代码是:

let数据=[
{日期:'2018-01-01',设备:'iphone',网站:'google',val1:10,val2:20,val3:30},
{日期:'2018-01-01',设备:'iphone',网站:'bing',val1:23,val2:12,val3:14},
{日期:'2018-01-01',设备:'iphone',网站:'jeeves',val1:67,val2:78,val3:12},
{日期:'2018-01-01',设备:'ipad',网站:'google',val1:10,val2:20,val3:30},
{日期:'2018-01-01',设备:'ipad',网站:'bing',val1:23,val2:12,val3:14},
{日期:'2018-01-01',设备:'ipad',网站:'jeeves',val1:67,val2:78,val3:12},
{日期:'2018-01-02',设备:'iphone',网站:'google',val1:11,val2:22,val3:33},
{日期:'2018-01-02',设备:'iphone',网站:'bing',val1:25,val2:27,val3:28},
{日期:'2018-01-02',设备:'iphone',网站:'jeeves',val1:67,val2:80,val3:15},
{日期:'2018-01-02',设备:'ipad',网站:'google',val1:12,val2:21,val3:31},
{日期:'2018-01-02',设备:'ipad',网站:'bing',val1:26,val2:16,val3:11},
{日期:'2018-01-02',设备:'ipad',网站:'jeeves',val1:65,val2:79,val3:55},
{日期:'2018-01-03',设备:'iphone',网站:'google',val1:17,val2:19,val3:11},
{日期:'2018-01-03',设备:'iphone',网站:'bing',val1:13,val2:15,val3:12},
{日期:'2018-01-03',设备:'iphone',网站:'jeeves',val1:69,val2:79,val3:15},
{日期:'2018-01-03',设备:'ipad',网站:'google',val1:17,val2:51,val3:31},
{日期:'2018-01-03',设备:'ipad',网站:'bing',val1:25,val2:15,val3:17},
{日期:'2018-01-03',设备:'ipad',网站:'jeeves',val1:61,val2:71,val3:15}
]
//按日期分组
const group_data=data.reduce((a,c)=>{
(a[c['date']]=a[c['date'].[124; |]])。推送(c);
返回a;
}, {});
//我能将数据相加,但不能将每个数据相加%。在这里,我可以按2个值进行分组,即“日期”和“设备”
常量grp_数据=(分组_数据、第一个_组、第二个_组)=>{
for(对象的常量键。键(分组的_数据)){
const map_data=new map();
为(常数){
[第一组]:日期[第二组]:设备,…其他值
}
分组的_数据[键]){
const row=map_data.get(日期+,'+设备)|{
日期,
装置
}
Object.entries(其他值).forEach([k,v])=>{
如果(/^[0-9,.]*$/.test(v)==true&&typeof v!='number')v=parseFloat(v.replace(/\,/gi');
行[k]=(行[k]| | 0)+v
});
映射数据集(日期+,,+设备,行);
}
分组的_数据[键]=[…映射_数据.values()];
}
}
grp_数据(组_数据,‘日期’、‘设备’);
控制台日志(组数据)

根据你的解释,我尝试了完全不同的方法

let数据=[
{日期:'2018-01-01',设备:'iphone',网站:'google',val1:10,val2:20,val3:30},
{日期:'2018-01-01',设备:'iphone',网站:'bing',val1:23,val2:12,val3:14},
{日期:'2018-01-01',设备:'iphone',网站:'jeeves',val1:67,val2:78,val3:12},
{日期:'2018-01-01',设备:'ipad',网站:'google',val1:10,val2:20,val3:30},
{日期:'2018-01-01',设备:'ipad',网站:'bing',val1:23,val2:12,val3:14},
{日期:'2018-01-01',设备:'ipad',网站:'jeeves',val1:67,val2:78,val3:12},
{日期:'2018-01-02',设备:'iphone',网站:'google',val1:11,val2:22,val3:33},
{日期:'2018-01-02',设备:'iphone',网站:'bing',val1:25,val2:27,val3:28},
{日期:'2018-01-02',设备:'iphone',网站:'jeeves',val1:67,val2:80,val3:15},
{日期:'2018-01-02',设备:'ipad',网站:'google',val1:12,val2:21,val3:31},
{日期:'2018-01-02',设备:'ipad',网站:'bing',val1:26,val2:16,val3:11},
{日期:'2018-01-02',设备:'ipad',网站:'jeeves',val1:65,val2:79,val3:55},
{日期:'2018-01-03',设备:'iphone',网站:'google',val1:17,val2:19,val3:11},
{日期:'2018-01-03',设备:'iphone',网站:'bing',val1:13,val2:15,val3:12},
{日期:'2018-01-03',设备:'iphone',网站:'jeeves',val1:69,val2:79,val3:15},
{日期:'2018-01-03',设备:'ipad',网站:'google',val1:17,val2:51,val3:31},
{日期:'2018-01-03',设备:'ipad',网站:'bing',val1:25,val2:15,val3:17},
{日期:'2018-01-03',设备:'ipad',网站:'jeeves',val1:61,val2:71,val3:15}
]
设dataObj={};
data.forEach(d=>{
如果(!dataObj[d.date])dataObj[d.date]={};
如果(!dataObj[d.date][d.device])dataObj[d.date][d.device]={};
如果(!dataObj[d.date][d.device].val1)dataObj[d.date][d.device].val1=0;
如果(!dataObj[d.date][d.device].val2)dataObj[d.date][d.device].val2=0;
如果(!dataObj[d.date][d.device].val3)dataObj[d.date][d.device].val3=0;
dataObj[d.date][d.device].val1+=d.val1;
dataObj[d.date][d.device].val2+=d.val2;
dataObj[d.date][d.device].val3+=d.val3;
});
data.forEach(d=>{
d、 val1=d.val1*100/dataObj[d.date][d.device].val1;
d、 val2=d.val2*100/dataObj[d.date][d.device].val2;
d、 val3=d.val3*100/dataObj[d.date][d.device].val3;
});

控制台日志(数据)@Mr_Green,正如我在最后提到的。当日期为“2018-01-01”和设备为“iphone”时,我将所有3个val1加起来,所以10+23+67,然后对于谷歌来说,这使得它(10*100)/100获得了谷歌的百分比,对于bing和jeeves来说也是如此。10%在JavaScript中是无效的数字。要么删除%号,要么将其设置为字符串。@palingh我可以删除%号。您可以在问题中添加“2018-01-01”的第一个索引是什么样子的吗