【问题标题】:Manipulate array of objects to new array with average number.将对象数组操作为具有平均数的新数组。
【发布时间】:2015-04-17 11:23:00
【问题描述】:

我有一个想要操作的数组,因为我需要将它用作 D3.js 的数据源。这个数据集的一个例子是:

var data =  [
 {day: 1, month: 1,  length: 100,  year: 2010},
 {day: 2, month: 1,  length: 125,  year: 2010},
 {day: 3, month: 1,  length: 150,  year: 2010},
 {day: 4, month: 1,  length: 175,  year: 2010},
 {day: 1, month: 2,  length: 225,  year: 2010},
 {day: 2, month: 2,  length: 250,  year: 2010},
 {day: 3, month: 2,  length: 325,  year: 2010},

 {day: 1, month: 1,  length: 225,  year: 2011},
 {day: 1, month: 1,  length: 150,  year: 2011},
 {day: 1, month: 1,  length: 190,  year: 2011},
 {day: 1, month: 2,  length: 210,  year: 2011},
 {day: 2, month: 2,  length: 110,  year: 2011},
 {day: 3, month: 2,  length: 160,  year: 2011},
 {day: 4, month: 2,  length: 190,  year: 2011},
]

在这种情况下,我想创建一个新数组,其中两个数组保存一个月的平均长度。例如:

var newData = [ [137.5, 266.7], [183.33, 167.5] ]

其中 newData[0][1] 是 2010 年第 1 个月的平均长度。

我有一些问题以一种很好的方式结合它。我可以创建长度的总和,但除以总和是困难的。我的代码是:

data.forEach(function (el) {
   for (var j = 0; j <= 3; j++) {
     if (el.year === 2010 + j) {
       for (var i = 1; i <= 2; i++) {
                if (el.month === i) {
                    var oldLength = dataNew[j][i - 1] || 0;
                    var newLength = el.length + oldLength;
                    dataNew[j][i - 1] = newLength;
                }
        }
     }
   }
});

如何调整此函数,以便在 newData 中保存平均值而不是总和。

【问题讨论】:

  • 所以原始数据的day 组件无关紧要?输入数据是否总是按月和年“排序”?输入数据来自哪里(也许可以修改该部分以立即提供所需的格式)?

标签: javascript arrays d3.js


【解决方案1】:

您可以使用 d3.js 本身来方便您的工作并使您的代码更具可读性。使用d3.nest()

var data =  [
 {day: 1, month: 1,  length: 100,  year: 2010},
 {day: 2, month: 1,  length: 125,  year: 2010},
 {day: 3, month: 1,  length: 150,  year: 2010},
 {day: 4, month: 1,  length: 175,  year: 2010},
 {day: 1, month: 2,  length: 225,  year: 2010},
 {day: 2, month: 2,  length: 250,  year: 2010},
 {day: 3, month: 2,  length: 325,  year: 2010},

 {day: 1, month: 1,  length: 225,  year: 2011},
 {day: 1, month: 1,  length: 150,  year: 2011},
 {day: 1, month: 1,  length: 190,  year: 2011},
 {day: 1, month: 2,  length: 210,  year: 2011},
 {day: 2, month: 2,  length: 110,  year: 2011},
 {day: 3, month: 2,  length: 160,  year: 2011},
 {day: 4, month: 2,  length: 190,  year: 2011},
]

var nest = d3.nest()
    .key(function(d){return d.year})
    .key(function(d){return d.month})
    .rollup(function(d){
        return d3.mean(d, function(g){return g.length});
    })
    .entries(data)

console.log(nest[0].values[0]) // 137.5

这是一个有效的fiddle

【讨论】:

  • 太棒了!我不知道 nest() 函数。谢谢。当我必须使用其他数据集时,这将非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多