【问题标题】:Mapping through an array of objects in javascript通过javascript中的对象数组映射
【发布时间】:2017-04-03 10:16:42
【问题描述】:

我有一个这样的对象数组:

[{side: Buy, price: 100}, {side: Buy, price: 110}, {side: Sell, price: 200}, {side: Buy, price: 150} ] 

现在我想为这个数组计算买卖双方的总和,以及每一方的平均价格总和。更具体地说,我希望我的输出是这样的: 购买 = 3 购买的平均价格 = 120 卖出 = 1 卖出平均价格 = 200 我是 javascript 的新手并且会做出反应,所以我遇到了一些困难。谢谢!:)

【问题讨论】:

  • 到目前为止你尝试过什么?听起来你想使用reduce :)
  • 这与 React FYI 无关。
  • 我使用 foreach 和 reduce,但遇到了一些困难

标签: javascript arrays loops object


【解决方案1】:

可能最简单的方法是迭代数组并为每个 side 保持滚动平均值。

var data = [{side: 'Buy', price: 100}, {side: 'Buy', price: 110}, {side: 'Sell', price: 200}, {side: 'Buy', price: 150} ];

var tally = { Buy: { count: 0, total: 0 }, Sell: { count: 0, total: 0 } };

data.forEach(item => {
    tally[item.side].count = tally[item.side].count + 1;
    tally[item.side].total = tally[item.side].total + item.price;
})

console.log("AvgPrice for Buy = " + (tally.Buy.total / tall.Buy.count) + " Sell = 1 AvgPrice for Sell = " + (tally.Sell.total / tall.Sell.count));

【讨论】:

  • 我认为这是最容易理解的解决方案
  • 澄清一下,您正在对整个 tally 变量进行硬编码。如果不仅仅是BuySell 元素会怎样?你会用手把它们写下来吗?不幸的是,它不会有效地工作,但我同意,由于代码更少,它现在更具可读性。
  • @Kinduser 当需求不需要时,编写超级动态代码是没有意义的。在买卖方面,不太可能需要添加太多的方面,因此对它们进行硬编码对于未来的可维护性是有意义的。您的示例也可以,但需要一段时间才能了解他们是否在几年后再次使用该示例(或者是否有新开发人员开始该项目)。
  • @MichaelPeyper 这并不像看起来那么复杂。我也只是个初学者,这5个月的经验。无论如何 - 我只是认为当有人决定就此提出问题时,他期待一个高质量的解决方案,即使他不理解它 - 这是继续学习的动力。
  • @Kinduser 各有各的。我将在一周中的任何一天都考虑到可读性而不是满足不存在的需求。此外,如果出现这样的要求,动态生成 tally 对象也不会花费太多时间。
【解决方案2】:

使用Array#forEachObject.keys() 的简单解决方案。

var arr = [{side: 'Buy', price: 100}, {side: 'Buy', price: 110}, {side: 'Sell', price: 200}, {side: 'Buy', price: 150}], obj = {}, res = [];

arr.forEach(function(v){
 (obj[v.side] || (obj[v.side] = [])).push(v.price);
});
var res = Object.keys(obj).reduce(function(s,a) {
  s[a] = obj[a].length;
  s['avg' + a] = obj[a].reduce((a,b) => a + b) / obj[a].length;
  return s;
}, {});
console.log(res);

【讨论】:

  • 我们可以在单个对象中添加输出值吗?顺便说一句,答案很好
  • 喜欢 obj = {aSide: 4, bSide: 8, aPrice: 123, bPrice: 12}
  • @user7334203 我会试试的
  • 很抱歉让您感到困惑。是不是太复杂了?
  • 太棒了!非常感谢
【解决方案3】:

使用像forEach, for etc这样的任何迭代器来迭代数据,并使用两个object变量,一个将存储buy数据,另一个将存储sell数据。

这样写:

var data = [{side: 'Buy', price: 100}, {side: 'Buy', price: 110}, {side: 'Sell', price: 200}, {side: 'Buy', price: 150} ];

var buy = {}, sell = {};

data.forEach(el => {
    if(el.side == 'Buy'){
          buy['count'] = (buy['count'] || 0) + 1;
          buy['total'] = (buy['total'] || 0) + el.price; 
    }else{
         sell['count'] = (sell['count'] || 0) + 1;
         sell['total'] = (sell['total'] || 0) + el.price; 
    }
})

console.log(buy.total/buy.count, sell.total/sell.count);

【讨论】:

    【解决方案4】:

    请检查:

        var arrayBuySell=[{side: Buy, price: 100}, {side: Buy, price: 110}, {side: Sell, price: 200}, {side: Buy, price: 150} ]
    var averageBuy = 0;
    var averageSell = 0;
    var totalbuy=0;
    var totalbuycount=0;
    var totalsellcount=0;
    var totalsell=0;
    for (var i = 0; i < arrayBuySell.length; i++) {
        if(arrayBuySell[i]="Buy")
          {
           totalbuy+=arrayBuySell[i].price;
           totalbuycount=arrayBuySell[i].price.Count();
          }
         else
          {
           totalsell+=arrayBuySell[i].price;
           totalsellcount=arrayBuySell[i].price.Count();
          }
      }
    averageBuy =totalbuy/totalbuycount;
    averageSell=totalsell/totalsellcount;
    

    【讨论】:

      【解决方案5】:

      你可以这样做:

      let arr = [{side: "Buy", price: 100}, {side: "Buy", price: 110}, {side:     "Sell", price: 200}, {side: "Buy", price: 150} ];
      let buyPrices = [];
      let sellPrices = [];
      arr.forEach((item, index) => {
        if (item.side === 'Buy') {
          buyPrices.push(item.price);
        } else if (item.side === 'Sell') {
          sellPrices.push(item.price);
        }
      });
      
      let avgBuy = buyPrices.reduce((a, b) => a + b)/buyPrices.length;
      console.log(`Buy -> ${buyPrices.length}
      AvgBuyPrices -> ${avgBuy}`);
      let avgSell = sellPrices.reduce((a, b) => a + b)/sellPrices.length;
      console.log(`Sell -> ${sellPrices.length}
      AvgSellPrices -> ${avgSell}`);
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2022-01-25
        • 2020-10-24
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        相关资源
        最近更新 更多