如何在数组中分组类别数组

How to groupBy category array inside an array

如何按类别 数组分组 来自 answers 属性 并使用下划线求平均值?

我有嵌套的对象数组。它应该按类别分组,并根据 val 属性 计算得出 Analytics 的平均值,即 1+2 => 3. 3/类别总数。所以,3/2 => 1.5

预期输出:{分析:1.5}

[ 
{ _id:"oq8DRjm6uA9mtoJvw", 
answers:[
{
  area:"Digital",
  category:"Analytics",
  qId:"wRHmpHHGzrYLsCEJ3",
  type:"Reorganize",
  userId:"M4JEJGiPZ8e9om9A",
  val:1
},
{
  area:"Digital",
  category:"Analytics",
  qId:"wRHmpHHGzrYLsCEJ3",
  type:"Reorganize",
  userId:"M4JEJGiPZ8e9om9A",
  val:2
}
],
date:Tue Aug 16 2016 11:13:59
}]

谢谢

如果我理解正确的话... 最简单的解决方案是迭代数组并为您检查的每个元素填充另一个数组。

数组应包含

{
categoryName: '',
valueSum: 0,
count: 0
}

O(n^2)复杂度的算法如下:

  • 获取数组的下一个元素
  • 如果类别存在于临时数组中,则将当前值添加到valueSum并递增count
  • 如果类别不存在,使用类别、值和设置 count 到 1
  • 向数组添加一个元素

当你迭代整个数组时,开始迭代临时数组并划分 valueSum / count,这将为你提供每个类别 AVG.

如果你只想要数组中第一个对象的答案的平均值,你可以得到答案数组,group the objects by category, and iterate over all the keys in this resulting object, and reduce the values:

var answers = array[0].answers;
var types = _.groupBy(answers, 'category');
var result = _.mapObject(types, function(val, key) {
  return _.reduce(val, function(memo, v) { 
    return memo + v.val; 
  }, 0) / val.length;
});

var array = [{ 
  _id:"oq8DRjm6uA9mtoJvw", 
  answers: [
  {
    area:"Digital",
    category:"Analytics",
    qId:"wRHmpHHGzrYLsCEJ3",
    type:"Reorganize",
    userId:"M4JEJGiPZ8e9om9A",
    val:1
  },
  {
    area:"Digital",
    category:"Analytics",
    qId:"wRHmpHHGzrYLsCEJ3",
    type:"Reorganize",
    userId:"M4JEJGiPZ8e9om9A",
    val:2
  }],
  date: 'Tue Aug 16 2016 11:13:59'
}];

var answers = array[0].answers;
var types = _.groupBy(answers, 'category');
var result = _.mapObject(types, function(val, key) {
  return _.reduce(val, function(memo, v) { 
    return memo + v.val; 
  }, 0) / val.length;
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>