问题描述
[
{
date: '22-03-2021,amount: 2,value: 10,fees: 0.1,type: "BUY"
transactionId: '21412412',}
]
我想对数组做两件事...
一个是获取每个日期的对象数组。对“BUY”类型的对象的价值属性求和,并从“SELL”类型的对象中减去价值属性。最终我将需要处理其他事务类型,但不是现在......
示例:(由于卖出和买入同时发生,您可以看到价值上升和下降)
[
{
date: "04-06-2021",value: 20.0,},{
date: "05-06-2021",value: 28.99,{
date: "06-06-2021",value: 47.99,{
date: "07-06-2021",value: 37.99,{
date: "08-06-2021",value: 42.29,]
两个非常相似。我想为每个日期生成一个对象数组,但与特定的股票代码相关联。
示例:(由于仅发生 BUY 导致价值上升)
[
{
TSLA: [
{
date: "04-06-2021",value: 23.99,value: 42.99,value: 47.29,]
}
]
这是我目前想到的:
const valueByDate = useMemo(
() =>
holdings
.map((data: any) => data)
.reduce((r: any,a: any) => {
// Find objects where ticker matches.
r[a.date] = r[a.date] || [];
// Push found object into array.
r[a.date].push({ type: a.type,value: a.value });
return r;
},Object.create(null)),[holdings],);
// valueByDate creates an object like so...
let arr = {
'22-05-2021': [{ type: 'SELL',value: '9' }],'22-06-2021': [{ type: 'SELL','22-07-2021': [{ type: 'SELL',};
// Sum or Deduct VALUE per date depending on TYPE
const reduce = Object.values(valueByDate).forEach((element: any) =>
Object.values(element)
.flat()
.reduce((accumulator: any,currentValue: any) => {
if (currentValue.type == 'BUY') {
return (
parseFloat(accumulator) + parseFloat(currentValue.value)
);
} else if (currentValue.type == 'SELL') {
return (
parseFloat(accumulator) - parseFloat(currentValue.value)
);
}
}),);
但我只是无法深入了解嵌套数组并有条件地计算这些值。任何见解都会有所帮助。
谢谢
解决方法
这些是我创建的函数:
type Transaction = {
date: string,amount: number,value: number,fees: number,type: "BUY" | "SELL",transactionId: string
}
const transactions: Transaction[] = [
{
date: '22-03-2021',amount: 2,value: 10,fees: 0.1,type: "BUY",transactionId: '21412412',},{
date: '22-03-2021',type: "SELL",{
date: '23-03-2021',]
type DatedTransactions = { [key: string]: Transaction[] }
function getValuesByDate(transactions: Transaction[]): DatedTransactions {
let result: { [key: string]: Transaction[] } = {}
transactions.forEach(transaction => {
result[transaction.date] ? result[transaction.date].push(transaction) : result[transaction.date] = [transaction]
})
return result
}
function getTotalValue(transactions: Transaction[]): number {
return transactions.reduce((prev,curr) => {
if (curr.type === "BUY") {
return prev + curr.value
}
return prev - curr.value
},0)
}
function getTotalValueForEveryDate(datedTransactions: DatedTransactions): { date: string,value: number }[] {
const result: { date: string,value: number }[] = []
Object.keys(datedTransactions).forEach(date => {
const datedValue = { date,value: getTotalValue(datedTransactions[date]) }
result.push(datedValue)
})
return result
}
console.log(getTotalValueForEveryDate(getValuesByDate(transactions)))
为了完成最后一部分,只需对每个代码进行迭代:)
如果有不清楚的地方请告诉我