【问题标题】:How do I return the sum of the duplicate values in an array of objects plus return the values of the non-duplicate values?如何返回对象数组中重复值的总和以及返回非重复值的值?
【发布时间】:2020-07-27 19:28:45
【问题描述】:

这里的第一个问题,所以请随时指出我应该做些什么不同的事情,或者我是否应该参考其他线程。

我有一组看起来像这样的对象:

const fetchResults = [ {
  date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
}, {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

我需要一个有效载荷,它返回每个交易日期和交易品种的数量和金额之和。 具体来说,在此示例中,它将合计 3 个对象的数量和金额,其中包含 TLTE 和 3/20/20。有效载荷结果如下所示:

const payloadResults = [ {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 385, amount: 13765.53,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

这是我尝试过的代码:

const fetchResults = [ {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
  }, {
    trade_date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
  }, {
    trade_date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
  }, {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
  }, {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
  }, {
    trade_date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
  } ]

  const payloadResults = []
  const uniqueTradeDates = Array.from(new Set(fetchResults.map(({ trade_date }) => trade_date)))
  const uniqueSecurityIds = Array.from(new Set(fetchResults.map(({ symbol }) => symbol)))
  for (const td of uniqueTradeDates) {
    for (const s of uniqueSecurityIds) {
      const results = fetchResults.filter((r) => r.symbol === s && r.trade_date === td)
      if (results.length > 0) {
        const totalQuantity = results.reduce((a, b) => a + b.quantity, 0)
        const totalAmount = results.reduce((a, b) => a + b.amount, 0)
        payloadResults.push({
          trade_date: td, symbol: s, quantity: totalQuantity, amount: totalAmount,
        })
      }
    }
  }
  console.log(payloadResults)

感谢您的帮助!

【问题讨论】:

  • 问题应该包括你尝试过的代码。请将其添加到您的问题中。
  • @jmargolisvt 10-4。我添加了我的工作。

标签: javascript arrays sum duplicates javascript-objects


【解决方案1】:

只需一个简单的 reduce 循环来组成一个对象,该对象的键由使它们重复的字段组成。在这种情况下,它是符号和日期。所以循环使用这两个字段创建一个键。检查我们以前是否见过它,如果有,我们只是更新数量和金额。如果没有,我们只需添加记录。

const fetchResults = [ {
  date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
}, {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

// Object values returns the values of all the properties in an object
const results = Object.values(
  // we are going to take our array and create a lookup object using reduce
  fetchResults.reduce((obj, data) => {
    // generate the key for our lookup object
    const key = data.symbol + data.date
    // check to see if the result exists yet
    const dayResult = obj[key]
    // if it exists we updated the record values
    if (dayResult) {
      dayResult.quantity += data.quantity
      dayResult.amount += data.amount    
    } else {
      // if it does not exist we copy the record into the  key we made
      obj[key] = { ...data }
    }
    // return our lookup data
    return obj
  }, {})
)

console.log(results)

【讨论】:

    【解决方案2】:

    将源数组重组为嵌套的 2 级字典,并通过迭代字典条目来计算总数:

    const fetchResults = [ {
            date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
        }, {
            date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
        }, {
            date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
        }, {
            date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
        }, {
            date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
        }, {
            date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
        }
    ];
    
    function aggregate () {
        let dict_aggregate = {}
          ;
          
        fetchResults.forEach ( (item, idx) => {
            if (dict_aggregate[item.date] === undefined) {
                dict_aggregate[item.date] = {};
            }
            if (dict_aggregate[item.date][item.symbol] === undefined) {
                dict_aggregate[item.date][item.symbol] = { quantity: 0, amount: 0.0 };
            }
            dict_aggregate[item.date][item.symbol].quantity  += item.quantity;
            dict_aggregate[item.date][item.symbol].amount    += item.amount;
        });
        
        let a_results = [];
        for (let [s_keyDate, dict_bySymbol] of Object.entries(dict_aggregate)) {
            for (let [s_keySymbol, dict_totals] of Object.entries(dict_bySymbol)) {
                a_results.push ({
                    date:       s_keyDate
                  , symbol:     s_keySymbol
                  , quantity:   dict_totals.quantity
                  , amount:     dict_totals.amount
                });
            }
        }
        
        return a_results;
    }
    
    let payloadResults = aggregate()
      ;
    
    console.log(JSON.stringify(payloadResults));
    
    
     

    【讨论】:

    • 酷!谢谢。不幸的是,我无法编辑初始负载。
    【解决方案3】:

    var fetchResults = [ 
      {date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570},
      {date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000},
      {date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222},
      {date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02},
      {date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51},
      {date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000}
    ];
    
    function sumResults(a) {
      var b = {}, c = [], d = 0;
      a.forEach(function(e) {
        var f = e.date + e.symbol;
        if(f in b) c[b[f]].quantity += e.quantity,
          c[b[f]].amount += e.amount;
        else b[f] = d++, c.push(e);
      });
      return c;
    }
    
    console.log(sumResults(fetchResults));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2014-06-20
      • 2018-04-02
      相关资源
      最近更新 更多