2014-02-06 3 views
0

У меня есть массив, который постоянно обновляется с аналоговыми показаниями с булавки Arduino.Найти значение 100 последних значений в массиве

Я хотел бы создать функцию, которая принимает последние 100 значений в массиве и возвращает среднее из них (массив имеет максимальную длину 100 000, при которой он начинает «перемещать» и «нажимать», чтобы сделать пространство для новых значений).

Я создал эту функцию, но она возвращает 'NaN' каждый раз, когда:

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; 
} 
Смежные вопросы