这里是第一个问题,所以请随时指出我应该做哪些不同的事情,或者是否还有其他我应该引用的线程。
我有如下所示的对象数组:
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/