Приведенные ниже данные представляют собой [тикер, количество, унитарный значение]Лучший способ сгруппировать многомерный массив
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;
});
Используйте объект, ключи которого являются тикер. Затем вы можете легко собрать все значения, связанные с запасом, и рассчитать общий и средний. – Barmar
Почему downvote? Это минимальная версия кода для воспроизведения проблемы. Данные взяты из электронной таблицы и содержат десятки столбцов. Я хотел бы использовать map/reduce для получения более упрощенного и оптимизированного кода, но примеры, которые я прочитал до сих пор, касаются только простых массивов. – dipold