Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
向对象中的每个元素添加sum并返回Javascript中前N个键/值对_Javascript_Arrays_Object_D3.js - Fatal编程技术网

向对象中的每个元素添加sum并返回Javascript中前N个键/值对

向对象中的每个元素添加sum并返回Javascript中前N个键/值对,javascript,arrays,object,d3.js,Javascript,Arrays,Object,D3.js,我有一个键/值对的对象数组,其中值是另一组键/值对,其中所有值都是数字。我想对每个键的所有值进行求和,然后为每个键添加一个新元素。一旦有了它,我希望能够根据聚合的和值选择对象数组中前5个主键 我的数据(对象)如下所示 { "Napkins":{ "N/A":200, "No supply":100, "More than 1 wk":150, "1 we

我有一个键/值对的对象数组,其中值是另一组键/值对,其中所有值都是数字。我想对每个键的所有值进行求和,然后为每个键添加一个新元素。一旦有了它,我希望能够根据聚合的和值选择对象数组中前5个主键

我的数据(对象)如下所示

{
   "Napkins":{
      "N/A":200,
      "No supply":100,
      "More than 1 wk":150,
      "1 week or less":50
   },
   "Plates":{
      "N/A":800
   },
   "Forks":{
      "N/A":100,
      "No supply":100,
      "More than 1 wk":50,
      "1 week or less":50
   },
   "Knives":{
      "N/A":300,
      "No supply":100
   }
}
我希望能够添加一个
total
值来对每个主外键的值求和,以便我的最终对象看起来是这样的:

{
   "Napkins":{
      "N/A":200,
      "No supply":100,
      "More than 1 wk":150,
      "1 week or less":50,
      "total":500
   },
   "Plates":{
      "N/A":800,
      "total":800
   },
   "Forks":{
      "N/A":100,
      "No supply":100,
      "More than 1 wk":50,
      "1 week or less":50,
      "total":300
   },
   "Knives":{
      "N/A":300,
      "No supply":100,
      "total":400
   }
}
一旦我有了它,我希望能够很容易地按
total
对数组进行排序,并按前5名或任意数字n进行切片,只返回那些n项,这样我就可以循环遍历它们,并为每个前n项创建d3可视化。我唯一的问题是获取顶级项所需的最终数组

EDIT:我能够编写一个嵌套循环来添加一个
total
字段。不确定是否有更好的方法来实现这一点,但现在希望了解访问slice和使用前5个
total
值访问key/value元素的最佳方法。这是我在原始对象中循环的代码:

for (const item of Object.values(processed_data)){
    let sum = Object.values(item).reduce((a,b) => a+b, 0);
    item.total = sum;
}

由于对象数据结构的原因,无法对值进行排序。但是,我能够在下面的代码中将条目数限制为
N

const数据={
“餐巾”:{
“不适用”:200,
“无供应”:100,
“超过1周”:150,
“1周或以下”:50
},
“盘子”:{
“不适用”:800
},
“叉子”:{
“不适用”:100,
“无供应”:100,
“超过1周”:50,
“1周或以下”:50
},
“刀”:{
“不适用”:300,
“无供应”:100
}
};
常数getTopN=3;
Object.values(数据).forEach(原因=>{
//或者,d3.sum(Object.values(reasons))也可以工作
reasons.total=Object.values(reasons).reduce((总和,v)=>sum+v,0);
}, {});
//从第N个阈值中获取值
常量阈值=对象值(数据)
.map(原因=>reasons.total)
.sort()
.reverse()[getTopN-1];
const topN=Object.entries(数据)
.filter(([type,reasons])=>reasons.total>=阈值)
.reduce((对象[类型,原因])=>{
obj[类型]=原因;
返回obj;
}, {});

控制台日志(topN)谢谢!这很有效。然而,我现在遇到了一些问题,当我尝试使用代码时,我必须在d3中可视化它,因为我似乎无法将它放入正确的数据结构中。另一种方法是将可视化代码更改为与上面的输出一起工作,但更改数据似乎更容易。是否有一种方法可以轻松地将上述数据转换为
arrayData
中每个项目的以下数组形式:
0:{原因:“N/a”,值:200}1:{原因:“无供应”,值:100}2:{原因:“超过1周”,值:150}3:{原因:“1周或更短”,值:50}4:{原因:“总计”,值:500}