Javascript JavsScript-通过嵌套数组循环

Javascript JavsScript-通过嵌套数组循环,javascript,arrays,json,multidimensional-array,javascript-objects,Javascript,Arrays,Json,Multidimensional Array,Javascript Objects,我有一个嵌套的金融投资组合JSON文件。我需要从所有投资组合账户的每个持有中获取证券类型(在示例JSON中,只有一个),以及每个投资组合的每个持有的合计净值,都在一个循环中 最后,我尝试使用此信息显示在一个饼图中,该饼图根据安全类型的净值进行分隔 JSON文件: { "id": 1, "username": "Test", "portfolio_accounts": [ {

我有一个嵌套的金融投资组合JSON文件。我需要从所有投资组合账户的每个持有中获取证券类型(在示例JSON中,只有一个),以及每个投资组合的每个持有的合计净值,都在一个循环中

最后,我尝试使用此信息显示在一个饼图中,该饼图根据安全类型的净值进行分隔

JSON文件:

{
    "id": 1,
    "username": "Test",
    "portfolio_accounts": [
        {
            "id": 1,
            "user": 1,
            "username": "Test",
            "account_type": "IRA",
            "name": "MyTestAccount",
            "description": "Just a Test",
            "balance": 100.00,
            "holdings": [
                {
                    "id": 1,
                    "portfolio_id": 2,
                    "security_type": "Stock",
                    "ticker": "GOOG",
                    "price": 1000.50,
                    "shares": 20,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 800.50
                }, 
                {
                    "id": 2,
                    "portfolio_id": 2,
                    "security_type": "Bond",
                    "ticker": "AMZN",
                    "price": 100.99,
                    "shares": 4,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 60.65
                }
            ]
        },
        {
            "id": 2,
            "user": 1,
            "username": "Test",
            "account_type": "IRA",
            "name": "MyTestAccount2 - Electric Boogaloo",
            "description": "Repeat",
            "balance": 100.00,
            "holdings": [
                {
                    "id": 3,
                    "portfolio_id": 3,
                    "security_type": "Bond",
                    "ticker": "GNMA",
                    "price": 530.50,
                    "shares": 2,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 40.20
                }
            ]
        }
    ]
}
  • 股票:(1000.50*20)=20010美元
  • 债券1:(100.99*4)=403.96美元
  • 债券2:(530.50*2)=1061美元
  • 债券总额:1464.96美元
此JSON的预期饼图输出示例:

{
    "id": 1,
    "username": "Test",
    "portfolio_accounts": [
        {
            "id": 1,
            "user": 1,
            "username": "Test",
            "account_type": "IRA",
            "name": "MyTestAccount",
            "description": "Just a Test",
            "balance": 100.00,
            "holdings": [
                {
                    "id": 1,
                    "portfolio_id": 2,
                    "security_type": "Stock",
                    "ticker": "GOOG",
                    "price": 1000.50,
                    "shares": 20,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 800.50
                }, 
                {
                    "id": 2,
                    "portfolio_id": 2,
                    "security_type": "Bond",
                    "ticker": "AMZN",
                    "price": 100.99,
                    "shares": 4,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 60.65
                }
            ]
        },
        {
            "id": 2,
            "user": 1,
            "username": "Test",
            "account_type": "IRA",
            "name": "MyTestAccount2 - Electric Boogaloo",
            "description": "Repeat",
            "balance": 100.00,
            "holdings": [
                {
                    "id": 3,
                    "portfolio_id": 3,
                    "security_type": "Bond",
                    "ticker": "GNMA",
                    "price": 530.50,
                    "shares": 2,
                    "purchase_date": "02-20-2021",
                    "cost_basis": 40.20
                }
            ]
        }
    ]
}

一个饼图,一种颜色的债券($1464.96),一种颜色的股票($20010),按比例填写。如果存在其他安全类型,如加密,我将需要执行相同的操作,并自动添加第三种颜色(等等)。

您可以创建一个对象,将所有可能的安全类型设置为0,然后对每次保留进行求和,例如:

let数据={
“id”:1,
“用户名”:“测试”,
“投资组合账户”:[
{
“id”:1,
“用户”:1,
“用户名”:“测试”,
“账户类型”:“IRA”,
“名称”:“MyTestAccount”,
“描述”:“只是一个测试”,
“余额”:100.00,
“控股”:[
{
“id”:1,
“投资组合id”:2,
“证券类型”:“股票”,
“股票代码”:“GOOG”,
“价格”:1000.50,
“股份”:20,
“购买日期”:“2021年2月20日”,
“成本基础”:800.50
}, 
{
“id”:2,
“投资组合id”:2,
“证券类型”:“债券”,
“股票代码”:“AMZN”,
“价格”:100.99,
“股份”:4,
“购买日期”:“2021年2月20日”,
“成本基础”:60.65
}
]
},
{
“id”:2,
“用户”:1,
“用户名”:“测试”,
“账户类型”:“IRA”,
“名称”:“MyTestAccount2-电动Boogaloo”,
“说明”:“重复”,
“余额”:100.00,
“控股”:[
{
“id”:3,
“投资组合id”:3,
“证券类型”:“债券”,
“股票代码”:“GNMA”,
“价格”:530.50,
“股份”:2,
“购买日期”:“2021年2月20日”,
“成本基础”:40.20
}
]
}
]
};
让安全类型={
债券:0,
股票:0,
加密:0
};
data.portfolio\u accounts.forEach(portfolio\u account=>{
投资组合账户.holdings.forEach(holding=>{
证券类型[持有.证券类型]+=holding.price*holding.shares;
});
});
console.log(安全类型)
const数据=
{id:1
,用户名:'Test'
,投资组合账户:
[{id:1
,使用者:1
,用户名:'Test'
,账户类型:'IRA'
,名称:“MyTestAccount”
,描述:'只是一个测试'
,结余:100.00
,持有:
[{id:1
,公文包编号:2
,安全类型:'股票'
,股票代码:'GOOG'
,售价:1000.50
,股份:20
,购买日期:'02-20-2021'
,成本基础:800.50
} 
,{id:2
,公文包编号:2
,证券类型:“债券”
,股票代码:'AMZN'
,售价:100.99
,股份:4
,购买日期:'02-20-2021'
,成本基础:60.65
} ] } 
,{id:2
,使用者:1
,用户名:'Test'
,账户类型:'IRA'
,名称:'MyTestAccount2-电动Boogaloo'
,描述:'重复'
,结余:100.00
,持有:
[{id:3]
,公文包编号:3
,证券类型:“债券”
,股票代码:'GNMA'
,售价:530.50
,股份:2
,购买日期:'02-20-2021'
,成本基础:40.20
} ] } ] } 
,证券类型={股票:0,债券:0}
;
对于(让data.portfolio_账户的ptfAcc)
用于(出租ptfAcc.holdings的hld)
证券类型[hld.证券类型]+=(hld.price*hld.shares)
;

log(安全类型)
是灵活解决方案的忠实粉丝,下面是一个使用

//const objectScan=require('object-scan');
const data={id:1,用户名:'Test',投资组合账户:[{id:1,用户:1,用户名:'Test',账户类型:'IRA',名称:'MyTestAccount',描述:'Just a Test',余额:100.00,持股:[{id:1,投资组合id:2,证券类型:'Stock',股票代码:'GOOG',价格:1000.50,股票:20,购买日期:'02-20-2021',成本基础:800.50},{id:2,投资组合\ id:2,证券\类型:'Bond',股票代码:'AMZN',价格:100.99,股票:4,购买日期:'02-20-2021',成本基础:60.65}]},{id:2,用户:1,用户名:'Test',账户\类型:'IRA',名称:'MyTestAccount2-Electric Boogaloo',说明:'Repeat',余额:100.00,持股:[{id:3,投资组合id:3,证券类型:'Bond',股票代码:'GNMA',价格:530.50,股票:2,购买日期:'02-20-2021',成本基础:40.20}]};
const r=objectScan(['portfolio_accounts[*].holdings[*]']{
反面:错,
过滤器n:({
值:{股票、价格、证券类型:securityType},
上下文:{持有量,总计}
}) => {
const netWorth=股票*价格;
push({[securityType]:netWorth});
如果(!(安全性输入)