簡體   English   中英

JavaScript ES6獲得在同一循環迭代中映射到數組中的值的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM