2011-07-21 7 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カウントの平均値であるすべての配列要素に第三に、第4の値を追加する必要があります前後。

例N = 3

場合3値が前に3カウント値の平均値であるべきであり、第4の値は、現在の配列要素の後に3カウント値の平均値であるべきです。 結果はそのように見える:Nカウントの平均値を計算するのに十分な値がないため

["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値は、計算されるカント値のプレースホルダ、より多くの何物でもありません。私は見当がつかない

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

、浩はそのためのコードをビルドするために: それは代わりにnullの3行目のため(23.2 + 35.6)/ 2「24.4」のように、利用可能なすべてのカウントの平均を配置することも可能です。

ヒントや支援が必要です。

ありがとうございます。

//更新:申し訳ありませんが、私は誰かが私の説明をすることができたのですか?なぜ2人がこの質問に投票しましたか?どうしてか分かりません。それは公正ではない - 私が間違いをしたら、私に話す? 申し訳ありません!

+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回反復し、2回目を逆に実行することは練習ですが、私は決して考えませんでした。すばらしいです!どうもありがとうございます。 –

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

ありがとう、あなたの答えと時間は、その解決に費やしてくれました。残念ながら、私は1つの答えを正しいものとしてマークすることができます - だから、私はlwburkから解決策を取ります。これはよりコンパクトで堅牢に見えます。ありがとうございました。 –

関連する問題