Вычислить среднее значение для многомерного массива

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

 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);

3 ответа

Решение

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

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

Код ниже:

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);
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);
Другие вопросы по тегам