首页 > 解决方案 > Javascript按多个字段分组平均值和计数

问题描述

data = [
  {
    "index": 0,
    "id": 47,
    "sepallengthcm": 5.1,
    "sepalwidthcm": 3.8,
    "unnamed:_3": 1.6,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 1,
    "id": 48,
    "sepallengthcm": 4.6,
    "sepalwidthcm": 3.2,
    "unnamed:_3": 1.4,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 2,
    "id": 49,
    "sepallengthcm": 5.3,
    "sepalwidthcm": 3.7,
    "unnamed:_3": 1.5,
    "petalwidthcm": 0.2,
    "species": "jennifer"
  },
  {
    "index": 3,
    "id": 50,
    "sepallengthcm": 5.0,
    "sepalwidthcm": 3.3,
    "unnamed:_3": 1.4,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 4,
    "id": 97,
    "sepallengthcm": 12.0,
    "sepalwidthcm": 2.9,
    "unnamed:_3": 4.2,
    "petalwidthcm": 1.3,
    "species": "jennifer"
  },
  {
    "index": 5,
    "id": 98,
    "sepallengthcm": 6.2,
    "sepalwidthcm": 2.9,
    "unnamed:_3": 4.3,
    "petalwidthcm": 1.3,
    "species": "jennifer"
  },
  {
    "index": 6,
    "id": 99,
    "sepallengthcm": 5.1,
    "sepalwidthcm": 2.5,
    "unnamed:_3": 3.0,
    "petalwidthcm": 1.1,
    "species": "kajol"
  },
  {
    "index": 7,
    "id": 100,
    "sepallengthcm": 11.0,
    "sepalwidthcm": 2.8,
    "unnamed:_3": 7.0,
    "petalwidthcm": 1.3,
    "species": "floaw"
  },
  {
    "index": 8,
    "id": 101,
    "sepallengthcm": 6.3,
    "sepalwidthcm": 3.3,
    "unnamed:_3": 6.0,
    "petalwidthcm": 2.5,
    "species": "Iris-flower"
  },
  {
    "index": 9,
    "id": 102,
    "sepallengthcm": 5.8,
    "sepalwidthcm": 2.7,
    "unnamed:_3": 5.1,
    "petalwidthcm": 1.9,
    "species": "Iris-flower"
  }
]

这是我的输入

export const groupByMultiple = (arr, category, value1, value2) => {
  let result = Object.values(arr.reduce(function(r, e) {
      let key = e[category];
      if (!r[key]) r[key] = e;
      else {
          let first_value = parseFloat(r[key][value1])
          let second_value = parseFloat(r[key][value2])
          first_value += parseFloat(e[value1]);
          second_value += parseFloat(e[value2])
      }
      return r;
    }, {}))

    return result
}

groupByMultiple(data, "species", "sepallengthcm", "sepalwidthcm")

上面的函数通过聚合物种和对 sepallengthcm 和 sepalwidthcm 求和来给出总和。

我试图以同样的方式实现平均和计数。但是,不幸的是我的方法不起作用。

请看一下

谢谢..

上面的函数通过聚合物种和对 sepallengthcm 和 sepalwidthcm 求和来给出总和。

我试图以同样的方式实现平均和计数。但是,不幸的是我的方法不起作用。

请看一下

谢谢..

标签: javascript

解决方案


您可以在 reduce 函数中为每个键添加新的键计数。然后使用结果数组,您可以调用 .map() 并计算 value1 和 value2 的平均值并将它们作为键添加到对象中,然后返回该对象,

data = [
  {
    "index": 0,
    "id": 47,
    "sepallengthcm": 5.1,
    "sepalwidthcm": 3.8,
    "unnamed:_3": 1.6,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 1,
    "id": 48,
    "sepallengthcm": 4.6,
    "sepalwidthcm": 3.2,
    "unnamed:_3": 1.4,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 2,
    "id": 49,
    "sepallengthcm": 5.3,
    "sepalwidthcm": 3.7,
    "unnamed:_3": 1.5,
    "petalwidthcm": 0.2,
    "species": "jennifer"
  },
  {
    "index": 3,
    "id": 50,
    "sepallengthcm": 5.0,
    "sepalwidthcm": 3.3,
    "unnamed:_3": 1.4,
    "petalwidthcm": 0.2,
    "species": "setosa"
  },
  {
    "index": 4,
    "id": 97,
    "sepallengthcm": 12.0,
    "sepalwidthcm": 2.9,
    "unnamed:_3": 4.2,
    "petalwidthcm": 1.3,
    "species": "jennifer"
  },
  {
    "index": 5,
    "id": 98,
    "sepallengthcm": 6.2,
    "sepalwidthcm": 2.9,
    "unnamed:_3": 4.3,
    "petalwidthcm": 1.3,
    "species": "jennifer"
  },
  {
    "index": 6,
    "id": 99,
    "sepallengthcm": 5.1,
    "sepalwidthcm": 2.5,
    "unnamed:_3": 3.0,
    "petalwidthcm": 1.1,
    "species": "kajol"
  },
  {
    "index": 7,
    "id": 100,
    "sepallengthcm": 11.0,
    "sepalwidthcm": 2.8,
    "unnamed:_3": 7.0,
    "petalwidthcm": 1.3,
    "species": "floaw"
  },
  {
    "index": 8,
    "id": 101,
    "sepallengthcm": 6.3,
    "sepalwidthcm": 3.3,
    "unnamed:_3": 6.0,
    "petalwidthcm": 2.5,
    "species": "Iris-flower"
  },
  {
    "index": 9,
    "id": 102,
    "sepallengthcm": 5.8,
    "sepalwidthcm": 2.7,
    "unnamed:_3": 5.1,
    "petalwidthcm": 1.9,
    "species": "Iris-flower"
  }
]

const groupByMultiple = (arr, category, value1, value2) => {
  let result = Object.values(arr.reduce(function(r, e) {
      let key = e[category];
      if (!r[key]) r[key] = {...e, count: 1};
      else {
          let first_value = parseFloat(r[key][value1])
          let second_value = parseFloat(r[key][value2])
          first_value += parseFloat(e[value1]);
          second_value += parseFloat(e[value2])
        
          r[key][value1] = first_value;
          r[key][value2] = second_value;
          r[key]['count'] += 1;
      }
      
      return r;
    }, {}));
  
    return result.map(item => {
      item[`average_${value1}`] = item[value1]/item.count;
      item[`average_${value2}`] = item[value2]/item.count;
      return item;
    })
}

const ret = groupByMultiple(data, "species", "sepallengthcm", "sepalwidthcm");
console.log(ret);


推荐阅读