2011-07-21 124 views
1

我有一个这样的数组:遍历阵列和计算的阵列部分的平均值

["2011-06-16 16:37:20",23.2], 
["2011-06-21 16:37:20",35.6], 
["2011-06-26 16:37:20",41.8], 
["2011-07-01 16:37:20",25], 
["2011-07-06 16:37:20",22.8], 
["2011-07-11 16:37:20",36.4], 
["2011-07-16 16:37:20",34], 
["2011-07-21 16:37:20",20] 
[...] 

Format: [$date,count] 

现在我需要一个第四值增加一个第三到每个数组元素,它是N计数的平均之前或之后。

实施例,如果N = 3

的第三值应该是3计数值的平均值之前和第四值应该是3计数值的当前数组元素后的平均。 结果看起来像:

["2011-06-16 16:37:20",23.2, null, 34.13], 
["2011-06-21 16:37:20",35.6, null, 29.86], 
["2011-06-26 16:37:20",41.8, null, 28.06], 
["2011-07-01 16:37:20",25, 33.53, 31.06], 
["2011-07-06 16:37:20",22.8, 34.13, 30.13], 
["2011-07-11 16:37:20",36.4, 29.86, null], 
["2011-07-16 16:37:20",34, 28.06, null], 
["2011-07-21 16:37:20",20, 31,06, null] 

null价值无非是那么占位符,它不能被计算的值,因为没有足够的值来计算出n个计数的平均值。 它也可以将所有可用计数的平均值,如“24.4”(23.2 + 35.6)/ 2为3号线,而不是null

["2011-06-26 16:37:20",41.8, 24.4, 28.06], 

我不知道,何来构建代码为。

希望有提示或帮助。

谢谢。

//更新:对不起,但..请问:有人可以解释我,为什么有两个人投下这个问题呢?我不知道为什么。这是不公平的 - 如果我犯了一个错误,请告诉我? 对不起!

+0

你真的应该尝试这种自己动手做,然后要求获得具体的帮助的东西,是给你麻烦。要求社区为你写的不是这个网站的全部... – maerics

+0

对不起,但我试了3个小时 - 但不知道。迭代通过数组并不是问题,但我不知道如何获得n个值之前的值和当前的n个值。 –

+0

尝试实施一个N = 1的解决方案 - 也就是将这个数字和之前的数字平均。然后尝试N = 2,看看是否出现模式。 – jimbojw

回答

2

使用各种高阶功能的解决方案:

var arrs = [ 
    ["2011-06-16 16:37:20",23.2], 
    ["2011-06-21 16:37:20",35.6], 
    ["2011-06-26 16:37:20",41.8], 
    ["2011-07-01 16:37:20",25], 
    ["2011-07-06 16:37:20",22.8], 
    ["2011-07-11 16:37:20",36.4], 
    ["2011-07-16 16:37:20",34], 
    ["2011-07-21 16:37:20",20]]; 

function avg(arr) { 
    return (arr.reduce(function(acc, el, i) { 
     return el + acc; 
    }, 0)/arr.length).toFixed(2) * 1; 
} 

function visit(acc, el, i, arr) { 
    el.push((acc.length >= 3) ? avg(acc) : null); 
    acc[i % 3] = el[1]; 
    return acc; 
} 

arrs.reduce(visit, []); 
arrs.reverse().reduce(visit, []); 
arrs.reverse(); 

结果:

[["2011-06-16 16:37:20", 23.2, null, 34.13], 
["2011-06-21 16:37:20", 35.6, null, 29.87], 
["2011-06-26 16:37:20", 41.8, null, 28.07], 
["2011-07-01 16:37:20", 25, 33.53, 31.07], 
["2011-07-06 16:37:20", 22.8, 34.13, 30.13], 
["2011-07-11 16:37:20", 36.4, 29.87, null], 
["2011-07-16 16:37:20", 34, 28.07, null], 
["2011-07-21 16:37:20", 20, 31.07, null]] 
+0

感谢您发布的解决方案。花了几分钟,直到我明白那里发生了什么,这个代码是如何工作的。但现在,我明白这个代码。迭代数组两次,第二次反向,这是一种练习,我从来没有想过。大!非常感谢。 –

2
arrays = [ 
    ["2011-06-16 16:37:20",23.2], 
["2011-06-21 16:37:20",35.6], 
["2011-06-26 16:37:20",41.8], 
["2011-07-01 16:37:20",25], 
["2011-07-06 16:37:20",22.8], 
["2011-07-11 16:37:20",36.4], 
["2011-07-16 16:37:20",34], 
["2011-07-21 16:37:20",20] 
]; 
arrays.forEach(function(el,i,theArray){ 
    var a=null,b=null; 
    if(i > 2){ 
     a = (theArray[i-3][1] + theArray[i-2][1] + theArray[i-1][1])/3; 
     a = a.toPrecision(a.toString().indexOf('.') != -1 ? 2+a.toString().indexOf('.') : a.toString().length); 
    } 
    if(i < theArray.length - 3){ 
     b = (theArray[i+3][1] + theArray[i+2][1] + theArray[i+1][1])/3; 
     b.toPrecision(b.toString().indexOf('.') != -1 ? 2+b.toString().indexOf('.') : b.toString().length); 
    } 
    el.push(a); 
    el.push(b); 
}); 
+0

谢谢你,为了你的回答和你的时间,你已经花费了这个解决方案。不幸的是,我只能将一个答案标记为正确的 - 所以我将采用lwburk的解决方案,它看起来更加紧凑和强大。谢谢。 –