[英]JavaScript ES6 get sum of values being mapped in array in the same loop iteration
我一直在嘗試解決一個獨特的挑戰。 我有一個這樣的對象:
obj =
[
{item: "Skirt", price: 290},
{item: "Shoes", price: 300},
{item: "Skirt", price: 450}, {item: "Jeans", price: 35}
]
我正在對此進行映射,以獲取重復項目的計數及其各自的平均價格,以便所需的輸出如下所示:
更新:
obj =
[
{
Skirt: 2,
price: 370, //2 being the count of skirt items, 370 average price
Jeans: 1,
Price: 35,
Shoes: 1,
Price: 30
}
]
我正在使用此功能來映射項目:
Av_price = function(values) {
let new_val = new Map();
for (let x of values)
new_val.set([x["item"]], [(new_val.get(x["item"])|| 0) +1), (new_val.get(x["price"] || x["price"])/x["price"]])
return [...new_val.entries()];
};
這里的問題是:我能夠計算物品的數量,例如裙子,但是我無法獲得第二個價值,我的意思是價格; 這樣我就可以將它們除以項目總數(例如,在此示例中,裙子的值為“ 2”)! 這個獨特的挑戰使我震驚了兩個星期。 有什么方法可以獲取在同一循環迭代中映射的所有裙的計數,然后將價格之和除以其計數即可得出平均價格?
我將非常感謝您的幫助!
您可以為相同的項目制作哈希表,然后從存儲的值中構建平均值。
var data = [{ item: "Skirt", price: 290 }, { item: "Shoes", price: 300 }, { item: "Skirt", price: 450 }, { item: "Jeans", price: 35 }], hash = Object.create(null), result = []; data.forEach(function (o) { var ref; if (!hash[o.item]) { hash[o.item] = [{ item: o.item }, [0, 0]] result.push(hash[o.item]); } ref = hash[o.item][1]; ref[1] = (ref[0] * ref[1] + o.price) / ++ref[0]; }); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
更改結果的數據結構后,您將忽略哈希表並直接獲取結果對象。
var data = [{ item: "Skirt", price: 290 }, { item: "Shoes", price: 300 }, { item: "Skirt", price: 450 }, { item: "Jeans", price: 35 }], result = data.reduce(function (o, { item, price }) { o[item] = o[item] || 0; o[item + 'Price'] = (o[item] * (o[item + 'Price'] || 0) + price) / ++o[item]; return o; }, {}); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
let totalItems = obj.reduce((acc, {name, price}) => {
if (!acc[name]) {
acc[name] = 0;
acc[`${name}Price`] = price;
}
acc[name] += 1;
return acc;
}, {});
現在,您具有每個項目的價格和每個項目的總數。 totalItems
對象將如下所示:
{
skirt: 6,
skirtPrice: 290,
shoes: 3,
shoesPrice: 300
}
等等。
使用Array#reduce創建地圖,其中將包含每個項目的count
和總價。 然后將映射擴展到條目,並使用Array#map將其映射為請求的格式:
const arr = [ {item: "Skirt", price: 290}, {item: "Shoes", price: 300}, {item: "Skirt", price: 450}, {item: "Jeans", price: 35} ]; const Av_price = (values) => [... new Map(values.reduce((map, { item, price }) => { const o = map.get(item) || { sum: 0, count: 0 }; o.count++; o.sum += price; return map.set(item, o); }, new Map())) ].map(([item, { count, sum }]) => [item, [count, sum/count]]); const result = Av_price(arr); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.