2014-02-06 21 views
0

我有一個陣列,它不斷用來自Arduino引腳的模擬讀數進行更新。查找陣列中100個最新值的值

我想創建一個函數,獲取數組中的最新100個值,並返回它們的平均值(該數組最大長度爲100,000,開始「移位」和「推送」新值的空間)。

我創造了這個功能,但它返回 '男' 每次:

function returnAverage(){ 

    var averageArray = []; 
    var sum = 0; 
    var sampleEnd = values.length 

    for (var x = sampleEnd - 100; x < sampleEnd; x++) { 
     averageArray[x] = values[x] 
    } 

    for(var i = 0; i < averageArray.length; i++){ 
     sum += parseInt(averageArray[i]); 
    } 

    var avg = sum/averageArray.length; 
    console.log(avg) 

} 

任何想法?

+2

什麼是'values'?它保證至少有100長? –

+1

同意@TedHopp。如果值爲空或者包含非數字字符,則最終將以NaN結尾。 – linstantnoodles

回答

2

如果值是數字的排列,最後最大100個項目平均:

function returnAverage(values) { 
    var arr = values.slice(-100); 

    return arr.reduce(function(a, b){ return a + b; }, 0)/(arr.length || 1); 
} 
+0

這適用於包含數值的數組。然而,OP的問題可能是'parseInt(averageArray [i])'可能會將'NaN'返回一個或多個值。 –

+0

@TedHopp:謝謝你的澄清! –

0

發行數量一個是和,averageArray.lnegth的終值爲0 似乎會發生這種情況,因爲「值」數組是空的。

參見下例:

var values = [0,1,2,3,4,5,6]; 
var averageArray = []; 
var sum = 0; 
var sampleEnd = values.length 

for (var x = sampleEnd - 7; x < sampleEnd; x++) { 
    averageArray[x] = values[x] 
} 

for(var i = 0; i < averageArray.length; i++){ 
    sum += parseInt(averageArray[i]); 
} 

var avg = sum/averageArray.length; 
console.log(avg) 

編輯:NaN的是由零的分割的結果。所以你可能想在計算之前檢查一下:

if(sum == 0 || averageArray.length == 0) 
{ 
    return 0; 
}