我遇到了这个话题:Merge multiple array of objects and sum duplicate values javascript,它与我试图做的事情非常接近。
我基本上需要相同的东西,但我需要平均值而不是总和。我认为可以做到的诀窍是:
var array1 = [{
price: "2",
ref: "A"
},
{
price: "20",
ref: "B"
},
{
price: "23",
ref: "C"
},
{
price: "23",
ref: "D"
}
];
var array2 = [{
price: "12",
ref: "A"
},
{
price: "5",
ref: "B"
},
{
price: "23",
ref: "E"
},
{
price: "23",
ref: "F"
}
];
var array3 = [{
name: "Blah",
fcp: "erol"
},
{
name: "Blah2",
fcp: "tpep"
}
];
var averagedArr = 2
var result = array1.concat(array2, array3).reduce(function(acc, curr) {
if (curr.ref) {
var fromMap = acc.map[curr.ref];
if (!fromMap) {
acc.map[curr.ref] = fromMap = {
price: 0,
ref: curr.ref
}
acc.result.push(fromMap);
}
fromMap.price += parseFloat(curr.price);
fromMap.price = parseFloat(fromMap.price/averagedArr);
} else {
acc.result.push(curr);
}
return acc;
}, {
map: {},
result: []
}).result;
console.log(result);
它不起作用,因为它似乎是在添加所有价格时平均每个价格,而不是在它们全部加在一起之后。例如,结果为ref:B
(20 + 5除以2)而不是12.5
,结果为7.5
(20/2 = 10; 10 + 5 = 15; 15/2 = 7.5)。如果有人能帮我解决这个问题,我将非常感激。
我会对@Grundy的原始主题发表评论,他提供了我正在使用的回复,但这是我的第一个问题,我无法发表评论。
这是小提琴。 https://jsfiddle.net/5xqbk9Lg/
提前致谢!
答案 0 :(得分:1)
如果创建了新的哈希条目,您可以收集哈希表中的所有值并为结果创建数据集。稍后收集价格并计算并构建实际ref
的平均值。
var array1 = [{ price: "2", ref: "A" }, { price: "20", ref: "B" }, { price: "23", ref: "C" }, { price: "23", ref: "D" }],
array2 = [{ price: "12", ref: "A" }, { price: "5", ref: "B" }, { price: "23", ref: "E" }, { price: "23", ref: "F" }],
array3 = [{ name: "Blah", fcp: "erol" }, { name: "Blah2", fcp: "tpep" }],
hash = Object.create(null),
result = [];
[array1, array2, array3].forEach(function (a) {
a.forEach(function (b) {
if ('ref' in b) {
if (!hash[b.ref]) {
hash[b.ref] = { result: { ref: b.ref, avg: 0 }, sum: 0, count: 0 };
result.push(hash[b.ref].result);
}
hash[b.ref].sum += +b.price,
hash[b.ref].count++;
hash[b.ref].result.avg = hash[b.ref].sum / hash[b.ref].count;
}
});
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
只需更改
fromMap.price = parseFloat(fromMap.price/averagedArr);
到
fromMap.finalPrice = parseFloat(fromMap.price/averagedArr);
并使用finalPrice变量作为结果。问题在于,您为每个添加到价格的项目除以averagedArr,而不仅仅是在最后 - 正是您所描述的是错误。通过使用单独的变量来存储您的最终结果,您每次都不会潜水。