2014-10-21 4 views
0

У меня есть пример массива. Он содержит день и ряд сбоев сборки.Вычислить Среднее значение для многомерного массива

var array = [["2014-08-13",3], 
       ["2014-08-13",3], 
       ["2014-08-14",4], 
       ["2014-08-12",2], 
       ["2014-08-13",3], 
       ["2014-08-12",2]]; 

Я хочу, чтобы перебирать массив и получить массив, который имеет место в течение каждого дня среднего значения числа отказов. Я пробовал некоторые вещи, но не мог найти правильное решение.

Мишень массив должен выглядеть следующим образом:

var targetArray = [["2014-08-13",3], 
        ["2014-08-14",4], 
        ["2014-08-12",2]]; 

, что я до сих пор сделать массив, который держит три даты:

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
     if (this[i] == obj) { 
      return true; 
     } 
    } 
    return false; 
} 


var array = [ 
    ["2014-08-13", 3], 
    ["2014-08-13", 3], 
    ["2014-08-14", 4], 
    ["2014-08-12", 2], 
    ["2014-08-13", 3], 
    ["2014-08-12", 2]]; 

var targetArray = []; 
for (var i = 0; i < array.length; i++) { 
    var temporaryArr = []; 

    var current = array[i]; 
    var currentDate = current[0]; 
    var currentValue = current[1]; 

    console.log("current: " + current); 

    if (!targetArray.contains(currentDate)) { 
     temporaryArr[0] = currentDate; 
     targetArray[targetArray.length] = temporaryArr; 
    } 

} 

console.log(targetArray); 

ответ

1

Во-первых, ваши даты должны быть строками или вы начнете получать некоторые действительно странные результаты:

var arr = [ 
    ['2014-08-13', 3], 
    ['2014-08-13', 3], 
    ['2014-08-14', 4], 
    ['2014-08-12', 2], 
    ['2014-08-13', 3], 
    ['2014-08-12', 2] 
]; 

Создайте новый объект. Мы будем использовать его ключи для хранения наших дат и значений для хранения сбоев и количества раз в этот день.

var obj = {}; 

Петля над массивом. Если ключ/дата не существует, добавьте его в объект и установите значение в массив, содержащий количество отказов, и установите текущий счетчик равным 1. Если ключ/дата существует, добавьте количество неудачных попыток суммировать и увеличить счетчик.

for (var i = 0, l = arr.length; i < l; i++) { 
    var el = arr[i]; 
    var date = el[0]; 
    var fails = el[1]; 
    if (!obj[date]) { 
    obj[date] = [fails, 1] 
    } else { 
    obj[date] = [obj[date][0] + fails, obj[date][1] + 1] 
    } 
} 

Завершите цикл над объектом и нажмите дату и среднее значение обратно в новый массив.

var out = []; 
for (var date in obj) { 
    out.push([date, obj[date][0]/obj[date][1]]) 
} 

DEMO

+0

как это поведение может быть изменено так, что оно имеет 2 места для таких значений, как [[2014-08-13,3,13], [2014-08-13,3,13], [2014-08-14,4 , 14] ..] и возвращает массив, подобный [[2014-08-13,3,32,5], ..]? – sanyooh

+0

@sanyooh, что это за второе значение? – Andy

+0

это было бы для каждого дня количество неудач и успехов на каждый день в качестве среднего значения. – sanyooh

1

код ниже:

var array = [ 
    ["2014-08-13", 3], 
    ["2014-08-14", 4], 
    ["2014-08-13", 3], 
    ["2014-08-12", 2], 
    ["2014-08-13", 3], 
    ["2014-08-12", 2] 
]; 

function average(array) { 
    var ret = {}, retArr = [], tmp, time, value; 
    for(var i=0, len=array.length; i < len; i++) { 
     tmp = array[i]; 
     time = tmp[0]; 
     value = tmp[1]; 
     if(time in ret) { 
      ret[time].push(value) 
     } else { 
      ret[time] = [value]; 
     } 
    } 
    for(var p in ret) { 
     var total = 0; 
     ret[p].forEach(function(val) { 
      total += val; 
     }); 
     retArr.push([p, total/ret[p].length]); 
    } 
    return retArr; 
} 

average(array); 
+0

спасибо так много! он работает отлично. – sanyooh

0
var myArray = [["2014-08-13", 3], 
       ["2014-08-13", 3], 
       ["2014-08-14", 4], 
       ["2014-08-12", 2], 
       ["2014-08-13", 3], 
       ["2014-08-12", 2]]; 

function getAverage(arr) { 
    var dates = []; 
    var values = []; 

    for(i=0; i<arr.length; i++){ 
    var index = dates.indexOf(arr[i][0]);  
    if(index == -1){ 
     dates.push(arr[i][0]); 
     values.push([arr[i][1]]); 
    }else{ 
     values[index].push(arr[i][1]); 
    } 
    } 

    for(d=0; d<dates.length;d++){ 
    var dateTotal = 0; 
    for(a=0;a<values[d].length;a++){ dateTotal += values[d][a] } 
    dates[d] = [dates[d], (dateTotal/values[d].length)] 
    } 

    return dates 
}; 

getAverage(myArray); 
Смежные вопросы