繁体   English   中英

Javascript - 过滤嵌套数组和对象

[英]Javascript - Filter a nested arrays and objects

我是 JavaScript 新手,我正在尝试过滤下面的嵌套数组。 如何使用 JavaScript 按状态、sales_rep 和 account_manager 或状态、sales_rep 或 account_manager 过滤数组,然后返回过滤后的数组。

我来自 python 背景。

[
{"account_manager":"Account Manager 1",
    "Accounts":[
        {
            "customer":"Customer 1",
            "Orders":[
                {
                    "order_no":"001",
                    "Services":[
                        {
                            "service_id":"001",
                            "sales_rep":"John Doe",
                            "order_project_manager":"Project Manager 1",
                            "status":"Provisioning - On Hold",
                        },
                        {
                            "service_id":"002",
                            "sales_rep":"Jane Doe",
                            "order_project_manager":"Project Manager 2",
                            "status":"Provisioning - Delay",
                        }
                    ]
                }
            ]
        }
    ]
},
    {
        "account_manager":"Account Manager 2",
        "Accounts":[
            {"customer":"Customer 2",
                "Orders":[
                    {
                        "order_no":"002",
                        "Services":[
                            {
                                "service_id":"003",
                                "sales_rep":"James Doe",
                                "order_project_manager":"Project Manager 3",
                                "status":"Provisioning - Delay",
                            },
                            {
                                "service_id":"003",
                                "sales_rep":"Mary Doe",
                                "order_project_manager":"Project Manager 1",
                                "status":"Provisioning - On Time (Low Risk)",
                            },
                            {
                                "service_id":"003",
                                "sales_rep":"Joey Doe",
                                "order_project_manager":"Project Manager 3",
                                "status":"Provisioning - On Time (High Risk)",
                            },

                        ]
                    }
                ]
            }
        ]
    },
]

如果按状态“Provisioning - Delay”过滤,预期结果应该是:

{"account_manager":"Account Manager 1",
        "Accounts":[
            {
                "customer":"Customer 1",
                "Orders":[
                    {
                        "order_no":"001",
                        "Services":[
                            {
                                "service_id":"002",
                                "sales_rep":"Jane Doe",
                                "order_project_manager":"Project Manager 2",
                                "status":"Provisioning - Delay",
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "account_manager":"Account Manager 2",
        "Accounts":[
            {"customer":"Customer 2",
                "Orders":[
                    {
                        "order_no":"002",
                        "Services":[
                            {
                                "service_id":"003",
                                "sales_rep":"James Doe",
                                "order_project_manager":"Project Manager 3",
                                "status":"Provisioning - Delay",
                            },

                        ]
                    }
                ]
            }
        ]
    },

https://jsfiddle.net/f7guyzk2/

function filter(status, inputData) {
  const filterServices = (order) => {
    return {
      ...order,
      Services: order.Services.filter((service) => service.status === status),
    };
  };
  const filterOrders = (account) => {
    return {
      ...account,
      Orders: account.Orders.map(filterServices).filter(
        (order) => order.Services.length > 0
      ),
    };
  };
  const filterAccounts = (item) => {
    return {
      ...item,
      Accounts: item.Accounts.map(filterOrders).filter(
        (account) => account.Orders.length > 0
      ),
    };
  };

  return inputData
    .map(filterAccounts)
    .filter((item) => item.Accounts.length > 0);
}

const res = filter("Provisioning - Delay", data /* Here put your data */);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM