Javascript 在包含其他对象数组的对象数组上循环。并进行一定的计算

Javascript 在包含其他对象数组的对象数组上循环。并进行一定的计算,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,让我解释一下我在说什么。我有以下数组: const days = [ { date: '2016-12-13T00:00:00.000Z', stats: [ { name: 'A', sold: 34, }, { name: 'B', sold: 3, }, { name: 'C', sold: 26, }, ], }, { date: '2016-12-14T00:00:00.000Z', stats: [

让我解释一下我在说什么。我有以下数组:

const days = [
{

    date: '2016-12-13T00:00:00.000Z',
    stats: [
      { name: 'A', sold: 34, },
      { name: 'B', sold: 3, },
      { name: 'C', sold: 26, },
    ],
  },
  {
    date: '2016-12-14T00:00:00.000Z',
    stats: [
      { name: 'D', sold: 34, },
      { name: 'E', sold: 3, },
      { name: 'F', sold: 26, },
    ],
  },
    {
    date: '2016-12-14T00:00:00.000Z',
    stats: [
      { name: 'D', sold: 34, },
      { name: 'E', sold: 3, },
      { name: 'F', sold: 26, },
    ],
  },
];
我想做的是找到每个
stat.name
的百分比,例如。如果我们合并所有售出的价值,我们会得到:
189
现在找到stat name
B
%

(3 / 189) * 100
这将给我:
1.58%
这表示该类别已售出商品的
%

理想情况下,我追求的结果如下:

const result = [
    { name: 'A', sold: 34, percentage: '17,98%' },
    { name: 'B', sold: 3, percentage: '1,58%', },
    { name: 'C', sold: 26, percentage: '13,75%', },
    { name: 'D', sold: 68, percentage: '35,97%', },
    { name: 'E', sold: 6, percentage: '3,17%' },
    { name: 'F', sold 52, percentage: '27,51%' },
];
到目前为止我所做的:

const days=[
{
日期:“2016-12-13T00:00:00.000Z”,
统计数据:[
{姓名:'A',售出:34,},
{名称:'B',售出:3,},
{姓名:'C',售出:26,},
],
},
{
日期:“2016-12-14T00:00:00.000Z”,
统计数据:[
{名称:'D',售出:34,},
{名称:'E',售出:3,},
{姓名:'F',售出:26,},
],
},
{
日期:“2016-12-14T00:00:00.000Z”,
统计数据:[
{名称:'D',售出:34,},
{名称:'E',售出:3,},
{姓名:'F',售出:26,},
],
},
];
设total=0;
days.map(record=>record.stats.map(category=>total+=category.seld));//保存总数;
const newStats=days.reduce(函数(过去日、当前日){
const nextStats=currentDay.stats.map(函数(stat){
const oldsald=pastDay.stats.find((old)=>old.name==stat.name);//按名称匹配的对象。
让新闻报道;
if(oldsaled){//如果匹配
newSold=stat.selled+oldsoled.selled//sum
}否则{//不要求和
newSold=stat.sell
}
stat.sell=newSold;
stat.percentage=`${(newSold/total*100).toFixed(2)}%`;
返回统计;
});
返回{
统计数据:下一个统计数据,
};
});

console.log(newStats)您可以首先收集售出数量,然后使用百分比呈现数组

var-days=[{date:'2016-12-13T00:00:00.000Z',统计数据:[{name:'A',salled:34,},{name:'B',salled:3,},{name:'C',salled:26,},},},{date date:'2016-12-14T00:00:00:00.000Z',统计数据:[{{name:'D',salled:'34,},{name:'E',salled:3,},{name:'F',salled:26,},},},},},{date date 2016-12-14T00:00:00:00.000Z,{salled:',{name:'E',售出:3,},{name:'F',售出:26,},],},],,
temp=对象创建(空),
结果=[],
总数=0;
天。forEach(函数(天){
day.stats.forEach(函数(stat){
总计+=已售出的统计数据;
temp[stat.name]=(temp[stat.name]| | 0)+stat.sell;
});
},Object.create(null));
结果=对象.keys(temp).map(函数(k){
返回{name:k,sell:temp[k],百分比:(temp[k]*100/总);
});
console.log(结果);
.as-console-wrapper{max-height:100%!important;top:0;}
与和一起使用,将所有统计数据组合到一个数组中。用于获取总和。映射
平面列表
,并使用:

(代码>代码>警察的日子=<代码>警察警察的日子日子={{{{代码>警察警察的日子日子={{{{代码>警察的日子日子={{{{{代码>警察的日子日子={{{{{{{{代码>警察的日子>天={{{日期:,,,,,,,,,,,,,统计:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,F“,“售出”:26}]}]; //将列表展平 const flatList=[].concat([],…days.map({stats}=>stats)); //得到总数 const sum=flatList.reduce((sum,{selled})=>sum+selled,0); //将百分比分配给每个 const result=flatList.map((stat)=>Object.assign({},stat,{百分比:`${(stat.sell/sum*100).toFixed(2)}%`});
console.log(result);
我强烈建议您添加一些通用函数,以消除此处的一些复杂性。有很多方法可以做到这一点,但我将把它作为练习留给您。如果我有更多时间,也许今天晚些时候我会更新答案

下面是一种使用
Array.prototype.reduce

const days=[{date:'2016-12-13T00:00:00.000Z',统计数据:[{name:'A',卖出:34,},{name:'B',卖出:3,},{name:'C',卖出:26,},],},{date date:'2016-12-14T00:00:00:00.000Z',统计数据:[{{name:'D',卖出:34,},{name:'E',卖出:3,},{name:'F',卖出:26,},},},},},},{date date 2016-12-14T00:00:00:00:00.000Z,{stats,},{,{姓名:'E',售出:3,},{姓名:'F',售出:26,}]]
const makeSalesReport=天=>{
设{map,sum}=days
.reduce((acc,{stats})=>[…acc,…stats],)
.reduce(({map,sum},{name,sell})=>({
map:map.set(名称,map.has(名称)?map.get(名称)+销售:销售),
总和:总和+售出
}),{map:new map(),和:0})
return Array.from(map,([name,sall])=>
({名称,售出,百分比:售出/总额*100}))
}

console.log(makeSalesReport(days))
我会使用一个好的老式循环来计算所有的总和。然后循环结果来计算百分比。数组上的循环是O(n)。重复两次仍然是O(n)。谢谢你,尼娜!这是最容易理解的方法:)