【问题标题】:How to count # of matching unique keys of an object (javascript)如何计算对象的匹配唯一键数(javascript)
【发布时间】:2017-11-02 15:50:59
【问题描述】:

我正在尝试获取一个对象的唯一键,添加值并计算每个对象有多少个唯一键,但无法找到一个优雅的解决方案。

原始对象数组:

[{
    "2017W40": 15.25
}, {
    "2017W40": 16.5
}, {
    "2017W40": 16.6
}, {
    "2017W40": 11
}, {
    "2017W40": 17.857142857142858
}, {
    "2017W40": 13
}, {
    "2017W41": 19
}, {
    "2017W41": 20.25
}, {
    "2017W41": 18.25
}, {
    "2017W41": 13
}, {
    "2017W41": 20.333333333333332
}, {
    "2017W41": 20.5
}, {
    "2017W41": 20.5
}, {
    "2017W42": 19.5
}, {
    "2017W42": 19.5
}, {
    "2017W42": 20
}, {
    "2017W42": 19.5
}, {
    "2017W42": 19.333333333333332
}, {
    "2017W42": 20
}, {
    "2017W42": 20.5
}, {
    "2017W43": 20
}, {
    "2017W43": 20
}, {
    "2017W43": 19.666666666666668
}, {
    "2017W43": 19.6
}, {
    "2017W43": 19.666666666666668
}, {
    "2017W43": 19
}, {
    "2017W43": 19.5
}, {
    "2017W44": 21
}, {
    "2017W44": 19.5
}, {
    "2017W44": 20
}, {
    "2017W44": 19.5
}]

求和对象:

{
    "2017W40": 90.20714285714286,
    "2017W41": 131.83333333333331,
    "2017W42": 138.33333333333331,
    "2017W43": 137.43333333333334,
    "2017W44": 80
}

但我还想包括每个计数(这样我可以得到一个平均值,而不仅仅是总和)这是我正在使用的方法:

function getValueAvg(valsByKey) {
  const dateObj = {};
  for (let i = 0; i < valsByKey.length; ++i) {
    for (const obj in valsByKey[i]) {
      if (dateObj[obj]) {
        // add them if exists already
        dateObj[obj] = dateObj[obj] + valsByKey[i][obj];
      } else {
        // first
        dateObj[obj] = valsByKey[i][obj];
      }
    }
  }

所以要么是

的最终对象
{
    {"2017W40": 90.20714285714286, count:x},
    {"2017W41": 131.83333333333331, count:x},
    {"2017W42": 138.33333333333331, count:x},
    {"2017W43": 137.43333333333334, count:x},
    {"2017W44": 80, count:x}
}

或者只是值除以计数对我来说会产生奇迹。 “2017W40”:90.20714285714286/计数

【问题讨论】:

    标签: javascript object key unique


    【解决方案1】:

    您可以只创建具有两个字段、一个值或总和字段以及一个计数字段的新对象。当您迭代数据时,您只需将值添加到值字段中,然后将计数加一。

    function getValueAvg(valsByKey) {
      const dateObj = {};
      for (let i = 0; i < valsByKey.length; ++i) {
        for (const obj in valsByKey[i]) {
          if (dateObj[obj]) {
            // add them if exists already
            dateObj[obj].val = dateObj[obj].val + valsByKey[i][obj];
            dateObj[obj].count += 1;
          } else {
            // first
            dateObj[obj] = {"val":valsByKey[i][obj], "count":1};
          }
        }
      }
      return dateObj;
    }
    
    var data = [{
      "2017W40": 15.25
    }, {
      "2017W40": 16.5
    }, {
      "2017W40": 16.6
    }, {
      "2017W40": 11
    }, {
      "2017W40": 17.857142857142858
    }, {
      "2017W40": 13
    }, {
      "2017W41": 19
    }, {
      "2017W41": 20.25
    }, {
      "2017W41": 18.25
    }, {
      "2017W41": 13
    }, {
      "2017W41": 20.333333333333332
    }, {
      "2017W41": 20.5
    }, {
      "2017W41": 20.5
    }, {
      "2017W42": 19.5
    }, {
      "2017W42": 19.5
    }, {
      "2017W42": 20
    }, {
      "2017W42": 19.5
    }, {
      "2017W42": 19.333333333333332
    }, {
      "2017W42": 20
    }, {
      "2017W42": 20.5
    }, {
      "2017W43": 20
    }, {
      "2017W43": 20
    }, {
      "2017W43": 19.666666666666668
    }, {
      "2017W43": 19.6
    }, {
      "2017W43": 19.666666666666668
    }, {
      "2017W43": 19
    }, {
      "2017W43": 19.5
    }, {
      "2017W44": 21
    }, {
      "2017W44": 19.5
    }, {
      "2017W44": 20
    }, {
      "2017W44": 19.5
    }]
    
    console.log(getValueAvg(data));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2013-12-23
      • 2021-01-02
      • 2015-12-09
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多