【问题标题】:Calculate the relative value of an item within an object计算对象内某项的相对值
【发布时间】:2022-01-17 17:28:54
【问题描述】:

是否有一个优雅的、可能是 ES6 的解决方案来从一个对象创建一个新对象。新对象应显示对象的每个项目占对象总数的相对百分比。

// init Object
const obj = {
  "PHP": 9,
  "HTML": 5,
  "JS": 6,
};

// expected Object
const newObj = {
  "PHP": 45, // 45%
  "HTML": 25,
  "JS": 30,
};

我的方法是 计算 obj 的总和。这是我的基数(const base = 20)。然后我使用Object.keysmap() 函数来计算。那三个步骤。也许会更短。

【问题讨论】:

  • @JeffBowman 谢谢你的回答!我几乎是这么想的。然后我会把这些步骤放在一个单独的函数中,它会足够短。也许在不久的将来会有一个新的函数可以自己完成。谢谢
  • 转换为答案。

标签: javascript ecmascript-6


【解决方案1】:

lodash 如果您不介意:

const _ = require('lodash');

total = _.sum(_.values(obj));
result = _.mapValues(obj, (v) => v / total * 100);

console.log(result); //{PHP: 45, HTML: 25, JS: 30}

【讨论】:

    【解决方案2】:

    Jeff 提出的解决方案之一是,您还可以首先从 obj 中的所有键/值对中计算“out of”总数,然后通过计算重新创建初始对象您在对象中循环时的百分比,如下例所示:

    const obj = {
      "PHP": 9,
      "HTML": 5,
      "JS": 6,
    };
    
    const total = Object.values(obj).reduce((a, b) => a + b, 0);
    const result = {};
    
    for (const key in obj) {
       const percentage = (obj[key] * 100) / total;
       result[key] = percentage;
    }
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      如果您有您建议的字典,您可以使用Object.entries 将其拆分,处理条目,使用map 处理条目,然后使用Object.fromEntries 重构对象。这是您的问题所要求的“从对象创建新对象”的最直接答案。

      虽然这可能看起来比您提出的方法更聪明/更实用(对值求和,然后使用 Object.keys 遍历键并一次处理一个),但我认为它不会更快、更短,或者比您建议的更易于维护。

      【讨论】:

      • 感谢您的回答。我们已经说过 cmets 中最重要的事情。我会将此答案标记为已接受,因为我认为这是正确答案。
      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2023-03-21
      • 2021-08-11
      • 2013-12-03
      • 2020-04-20
      • 2017-06-25
      • 2022-01-20
      相关资源
      最近更新 更多