获取一系列交易并将值汇总到相应的日期有条件地

问题描述


所以我有一个看起来像这样的交易数组:

[
 {
  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)))

为了完成最后一部分,只需对每个代码进行迭代:)

如果有不清楚的地方请告诉我

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...