如何计算对象的匹配唯一键的数量(javascript)

时间:2017-11-02 15:50:59

标签: javascript object key unique

我试图获取对象的唯一键,添加值并计算每个键的唯一键数,但无法找到优雅的解决方案。

objs的原始数组:

[{
    "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}
}

或只是除以数量的值将为我创造奇迹。 &#34; 2017W40&#34;:90.20714285714286 / count

1 个答案:

答案 0 :(得分:0)

您可以创建具有两个字段的新对象,值或求和字段以及计数字段。迭代数据时,只需添加到值字段中,然后将计数加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));