微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将总和添加到对象中的每个元素,并在Javascript中返回前N个键/值对

如何解决将总和添加到对象中的每个元素,并在Javascript中返回前N个键/值对

我有一个键/值对的对象数组,其中值是另一组键/值对,其中所有值都是数字。我想对每个键的所有值进行汇总,然后为每个键添加一个新元素,并添加该总和。一旦有了这些信息,我便可以根据汇总的总和值选择对象数组中的前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,"More than 1 wk":50,"Knives":{
      "N/A":300,"No supply":100
   }
}

我希望能够添加一个total值以求和每个主外键的值,以便最终对象看起来像这样:

{
   "Napkins":{
      "N/A":200,"1 week or less":50,"total":500
   },"Plates":{
      "N/A":800,"total":800
   },"total":300
   },"total":400
   }
}

一旦有了,我希望能够轻松按total对数组进行排序,并按前5个或任意数字 n 对其进行切片,以仅返回那些 n 个项目,这样我就可以遍历它们,并为每个 n 个主要项目创建d3可视化。我唯一的问题是获得所需的最终阵列和顶部物品。

编辑:我能够编写一个嵌套循环来添加total字段。不确定是否有更好的方法可以执行此操作,但是现在希望了解了解访问切片和访问前5个total值的键/值元素的最佳方法。这是我遍历原始对象的代码

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

解决方法

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

const data = {
  "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,"More than 1 wk": 50,"Knives": {
    "N/A": 300,"No supply": 100
  }
};

const getTopN = 3;
Object.values(data).forEach(reasons => {
  // Alternatively,d3.sum(Object.values(reasons)) also works
  reasons.total = Object.values(reasons).reduce((sum,v) => sum + v,0);
},{});

// Get the value from the N^th threshold
const threshold = Object.values(data)
  .map(reasons => reasons.total)
  .sort()
  .reverse()[getTopN - 1];

const topN = Object.entries(data)
  .filter(([type,reasons]) => reasons.total >= threshold)
  .reduce((obj,[type,reasons]) => {
    obj[type] = reasons;
    return obj;
  },{});

console.log(topN);


或者,您可以更改数据结构吗?

const data = {
  "Napkins": {
    "N/A": 200,"No supply": 100
  }
};

const getTopN = 3;
const arrayData = Object.entries(data)
  .map(([item,reasons]) => ({
    item,total: Object.values(reasons).reduce((sum,0),reasons
  }))
  .sort((a,b) => b.total - a.total)
  .slice(0,getTopN);
console.log(arrayData);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。