以下数据代表[股票代码,金额,单一价值]
var data = [
['A', 140, 82.4],
['B', 100, 55.5],
['A', 30, 77.2],
['B', 200, 60.1]
];
如何使用JavaScript的Map,Reduce和Filter计算股票代码并计算平均价格和总价值,如[股票代码,金额,平均价格,总价值]这样的新矩阵:
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 :(得分:0)
您可以使用临时对象this
来引用结果数组newData
并添加位置并计算数组的平均值,第一项为关键this[a[0]]
。< / p>
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>');