javascript - 如何返回对象数组中重复值的总和并返回非重复值的值?

标签 javascript arrays sum duplicates javascript-objects

这里是第一个问题,所以请随时指出我应该做哪些不同的事情,或者是否还有其他我应该引用的线程。

我有如下所示的对象数组:

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,
} ]

我需要一个返回每个交易日期和代码的数量和金额总和的有效负载。 具体来说,在此示例中,它将使用 TLTE 和 3/20/20 对 3 个对象的数量和金额进行总计。有效负载结果如下所示:

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)

感谢您的帮助!

最佳答案

只是一个简单的循环,使用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)

关于javascript - 如何返回对象数组中重复值的总和并返回非重复值的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61218376/

相关文章:

javascript - RxJs:基于计数的可变样本量

javascript - 将函数原型(prototype)设置为 null 对新创建的 javascript 对象没有影响

javascript - Javascript 对象类似于 SQL 'JOIN'?

java - 遗传算法的数组帮助

使用C代码计算库仑定律

javascript - 在网页中选择现有对象或创建新对象的正确方法是什么?

javascript - 有谁知道好的ajax脚本加载器

java - 从文件中读取 int[][]。 java

SQL(sqlite)比较由另一个重复行分组的行的总和

mysql - 根据MySQL中的日期对两个表的总和进行分组