2016-04-04 5 views
-2

Приведенные ниже данные представляют собой [тикер, количество, унитарный значение]Лучший способ сгруппировать многомерный массив

var data = [ 
    ['A', 140, 82.4], 
    ['B', 100, 55.5], 
    ['A', 30, 77.2], 
    ['B', 200, 60.1] 
]; 

Как группировать по тикер коды, и вычислить среднюю цену и общую стоимость, используя карту в JavaScript , Reduce, и фильтр, в новой матрице, как [тикер, сумма, средняя цена, общая стоимость]:

var newData = [ 
    ['A', 170, 81.482, 13852], 
    ['B', 300, 58.566, 17570]] 
]; 

Вот что я пытался до сих пор. Есть ли способ сделать этот код более эффективным с точки зрения кратчайшего, элегантного кода?

var newData = data.map(function(item) { 
    return data.filter(function(itemFilter) { 
    return itemFilter[0] == item[0]; 
    }) 
    .reduce(function(array, item) { 
    array[0] = item[0]; 
    array[1] += item[1]; 
    array[3] += (item[1] * item[2]); 
    array[2] = array[3]/array[1]; 
    return array; 
    }, ['', 0, 0, 0]); 
}) 
//Remove duplicate items 
.filter(function(item, index, inputArray) { 
    return inputArray.map(function(item) { 
    return item[0]; 
    }).indexOf(item[0]) == index; 
}); 
+0

Используйте объект, ключи которого являются тикер. Затем вы можете легко собрать все значения, связанные с запасом, и рассчитать общий и средний. – Barmar

+0

Почему downvote? Это минимальная версия кода для воспроизведения проблемы. Данные взяты из электронной таблицы и содержат десятки столбцов. Я хотел бы использовать map/reduce для получения более упрощенного и оптимизированного кода, но примеры, которые я прочитал до сих пор, касаются только простых массивов. – dipold

ответ

0

Вы можете использовать временный объект this для ссылки на результирующий массив newData и добавить позиции и вычислить среднее значение в массиве с первого элемента в качестве ключа this[a[0]].

var data = [['A', 140, 82.4], ['B', 100, 55.5], ['A', 30, 77.2], ['B', 200, 60.1]], 
 
    newData = []; 
 

 
data.forEach(function (a) { 
 
    var product = a[1] * a[2]; 
 
    if (!this[a[0]]) { 
 
     this[a[0]] = [a[0], 0, 0, 0]; 
 
     newData.push(this[a[0]]); 
 
    } 
 
    this[a[0]][1] += a[1]; 
 
    this[a[0]][3] += product; 
 
    this[a[0]][2] = this[a[0]][3]/this[a[0]][1]; 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(newData, 0, 4) + '</pre>');

Смежные вопросы