展平深层嵌套的对象数组 [英] Flattening deeply nested array of objects

查看:65
本文介绍了展平深层嵌套的对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了以下数据结构,这是一个帐户对象数组,其中一些帐户是其子帐户的父母,而这些帐户又可以是其他帐户的父母等:

I got following data structure, which is an array of accounts objects, where some accounts are being parents to its children accounts, which in turn can be parents to other accounts etc.:

[{
  "id": "acc.1260446672222.11",
  "type": "EXPENSES_FOLDER",
  "name": "Expense Group",
  "balance": 3418.11,
  "children": [{
    "id": "acc.1260446672238.27",
    "type": "EXPENSE",
    "name": "Advertising, Promotion and Entertainment Account",
    "balance": 0,
    "children": []
  }, {
    "id": "acc.9a2492ba-0d82-4f4a-a1b4-14868f1e1a39",
    "type": "EXPENSES_FOLDER",
    "name": "Premises Costs",
    "balance": 0,
    "children": [{
      "id": "acc.287ba5b6-5536-428b-950f-d71d2af73ccc",
      "type": "EXPENSE",
      "name": "Use of Home - Gas",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.7091ee15-3f02-4bd1-94e5-5918cf986969",
      "type": "EXPENSE",
      "name": "Hire of Venue, Studios, Teaching Rooms",
      "balance": 0,
      "children": [

      ]
    }]
  }, {
    "id": "acc.827ec446-edeb-4f2b-8032-d306292d2d83",
    "type": "EXPENSES_FOLDER",
    "name": "Administrative Expenses",
    "balance": 558.61,
    "children": [{
      "id": "acc.0ed5fc81-7734-4452-86a9-db22a6b0f8e8",
      "type": "EXPENSE",
      "name": "Bank Charges",
      "balance": 15,
      "children": [

      ]
    }, {
      "id": "acc.e2cdb2c0-8565-4991-a35a-d4596b0ddf45",
      "type": "EXPENSE",
      "name": "Software & Computer Peripherals",
      "balance": 417.13,
      "children": [

      ]
    }, {
      "id": "acc.96d5d00e-43f4-4d3a-b97b-fdf258c65514",
      "type": "EXPENSE",
      "name": "Printing, photocopying etc",
      "balance": 55.93,
      "children": [

      ]
    }, {
      "id": "acc.494dd64a-4fb3-42b8-be3e-8f3b59a2ef59",
      "type": "EXPENSE",
      "name": "Artists Administration Service",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.1260446672238.35",
      "type": "EXPENSE",
      "name": "Stationery",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.96d89d0d-5465-488b-b37f-d41ca114c5e6",
      "type": "EXPENSE",
      "name": "Mobile Telephone",
      "balance": 41.19,
      "children": [

      ]
    }, {
      "id": "acc.1260446672238.33",
      "type": "EXPENSE",
      "name": "Home Telephone",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.1260446672238.38",
      "type": "EXPENSE",
      "name": "Postage/delivery",
      "balance": 29.36,
      "children": [

      ]
    }]
  }, {
    "id": "acc.b9c9bbc7-43df-472e-9ac8-c7c76f08f49a",
    "type": "EXPENSES_FOLDER",
    "name": "Instruments, Equipment Maintenance etc",
    "balance": 1002.48,
    "children": [{
      "id": "acc.1260446672238.32",
      "type": "OTHER_EXPENSES",
      "name": "Instrument Insurance",
      "balance": 157.48,
      "children": [

      ]
    }, {
      "id": "acc.2a1cca15-2868-4770-a3e7-d43a6268c6a1",
      "type": "EXPENSE",
      "name": "Instrument Repairs & Maintenance",
      "balance": 845,
      "children": [

      ]
    }, {
      "id": "acc.a908aee0-84fb-450a-916b-4cec25265aef",
      "type": "EXPENSE",
      "name": "Accessories & Replacement Parts",
      "balance": 0,
      "children": [

      ]
    }]
  }, {
    "id": "acc.a42cdd86-0d9e-4f3f-af0d-7c4525374731",
    "type": "EXPENSES_FOLDER",
    "name": "Motor Vehicle",
    "balance": 0,
    "children": [{
      "id": "acc.cb325e7e-0ce4-4c78-9cb4-20659df733a6",
      "type": "EXPENSE",
      "name": "Fuel and Oil",
      "balance": 0,
      "children": [

      ]
    }]
  }, {
    "id": "acc.4bdd9e26-ce64-4e7f-b46a-82ec9de06ded",
    "type": "EXPENSES_FOLDER",
    "name": "Other Travel",
    "balance": 132.1,
    "children": [{
      "id": "acc.77dd2142-f2de-4a2c-9247-061d0661bc0a",
      "type": "EXPENSE",
      "name": "Taxis",
      "balance": 24.5,
      "children": [

      ]
    }, {
      "id": "acc.2b54abdd-7ef5-43cd-bdb9-c8c981b59ff2",
      "type": "EXPENSE",
      "name": "Public Transport",
      "balance": 107.6,
      "children": [

      ]
    }]
  }, {
    "id": "acc.e4695b70-31fa-4e23-afd0-97335dcd5b9e",
    "type": "EXPENSE",
    "name": "Subsitence",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.02d222bf-4dff-4308-afe9-69b93f412ada",
    "type": "EXPENSE",
    "name": "Hotel and Accomodation",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.d61cd5b4-2c80-4ab8-93d0-9d5726bd253b",
    "type": "EXPENSES_FOLDER",
    "name": "Fees and Commission Paid",
    "balance": 0,
    "children": [{
      "id": "acc.1262189019758.7",
      "type": "EXPENSE",
      "name": "Pupils exam entry fees",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.a7d7efd3-d0da-4704-babb-079b6077f3fe",
      "type": "EXPENSE",
      "name": "Audition, competition entry fees",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.3b91ee4e-40a8-46d8-aa05-3afa5974b3ef",
      "type": "EXPENSE",
      "name": "Deputies, Other Musicians",
      "balance": 0,
      "children": [

      ]
    }]
  }, {
    "id": "acc.250d6872-6023-4599-a0b6-b7159eebbfa1",
    "type": "EXPENSES_FOLDER",
    "name": "Other Professional Expenses",
    "balance": 1739.42,
    "children": [{
      "id": "acc.b7315228-f85a-4ffb-9199-d1128a409e5f",
      "type": "EXPENSE",
      "name": "Promotion & Publicity",
      "balance": 138.6,
      "children": [

      ]
    }, {
      "id": "acc.69ca2005-d7a0-448b-b70c-dafb128a48ae",
      "type": "EXPENSE",
      "name": "Other Expenses",
      "balance": 364.5,
      "children": [

      ]
    }, {
      "id": "acc.dcd999d2-4e18-41be-b9cc-218d4034b88e",
      "type": "EXPENSE",
      "name": "Office Equipment, Furniture",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.e0460706-d5c9-4c40-9d1e-0d2058864b92",
      "type": "EXPENSE",
      "name": "CDs, Dowloads etc",
      "balance": 67.57,
      "children": [

      ]
    }, {
      "id": "acc.1866df79-9e44-459a-a978-727904987469",
      "type": "EXPENSE",
      "name": "Professional Books, Magazines",
      "balance": 104.01,
      "children": [

      ]
    }, {
      "id": "acc.24c1651d-e7ae-48bc-a32d-311427e0fcea",
      "type": "EXPENSE",
      "name": "Professional Associations",
      "balance": 272.17,
      "children": [

      ]
    }, {
      "id": "acc.289ab0ac-b9d3-435e-ac82-9da9702b7d4b",
      "type": "EXPENSE",
      "name": "Tuition",
      "balance": 470,
      "children": [

      ]
    }, {
      "id": "acc.f24cf99b-6291-4b9f-821e-425f4909d4e1",
      "type": "EXPENSE",
      "name": "Scores, Manuscript Paper etc",
      "balance": 215.32,
      "children": [

      ]
    }, {
      "id": "acc.1af95953-56f0-455e-9d0a-7c4e0477cf0d",
      "type": "EXPENSE",
      "name": "Performance Clothing",
      "balance": 0,
      "children": [

      ]
    }, {
      "id": "acc.c0585577-535a-4ae2-a02b-e5b249f67c67",
      "type": "EXPENSE",
      "name": "Concerts, Shows etc",
      "balance": 107.25,
      "children": [

      ]
    }]
  }, {
    "id": "acc.1260446672222.24",
    "type": "ADMIN",
    "name": "Administrative Expenses",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1260446672238.26",
    "type": "TRAVEL",
    "name": "Travel and Subsistence Account",
    "balance": -14.5,
    "children": [

    ]
  }, {
    "id": "acc.1260446672238.28",
    "type": "LEGAL",
    "name": "Legal and Professional Costs Account",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1260446672238.36",
    "type": "OTHER_EXPENSES",
    "name": "Rent/Rates",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1262191376548.37",
    "type": "EXPENSE",
    "name": "Research",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1262191388329.38",
    "type": "EXPENSE",
    "name": "Professional Development",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1262192291558.52",
    "type": "EXPENSE",
    "name": "Professional Presentation",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1262193596634.72",
    "type": "EXPENSE",
    "name": "Subscriptions",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1262265941130.16",
    "type": "EXPENSE",
    "name": "Piano accompaniment",
    "balance": 0,
    "children": [

    ]
  }, {
    "id": "acc.1267370824329.1",
    "type": "EXPENSE",
    "name": "Cost of Sales",
    "balance": 0,
    "children": [

    ]
  }]
}]

我需要的是扁平化这个数组有一个简单的帐户列表。在 Vanilla JavaScript 中继续使用它的方法是什么? (我也可以访问项目中的 lodash 方法。)

What I need is to flatten this array to have a flat list of accounts. What's the way to proceed with that in Vanilla JavaScript. (I also got access to lodash methods in my project).

推荐答案

重复迭代,如果找到孩子,则从子节点获取数组。

Just iterate over and if a children is found get the array from the children concatinated.

function flat(array) {
    var result = [];
    array.forEach(function (a) {
        result.push(a);
        if (Array.isArray(a.children)) {
            result = result.concat(flat(a.children));
        }
    });
    return result;
}

var data = [{ id: "acc.1260446672222.11", type: "EXPENSES_FOLDER", name: "Expense Group", balance: 3418.11, children: [{ id: "acc.1260446672238.27", type: "EXPENSE", name: "Advertising, Promotion and Entertainment Account", balance: 0, children: [] }, { id: "acc.9a2492ba-0d82-4f4a-a1b4-14868f1e1a39", type: "EXPENSES_FOLDER", name: "Premises Costs", balance: 0, children: [{ id: "acc.287ba5b6-5536-428b-950f-d71d2af73ccc", type: "EXPENSE", name: "Use of Home - Gas", balance: 0, children: [] }, { id: "acc.7091ee15-3f02-4bd1-94e5-5918cf986969", type: "EXPENSE", name: "Hire of Venue, Studios, Teaching Rooms", balance: 0, children: [] }] }, { id: "acc.827ec446-edeb-4f2b-8032-d306292d2d83", type: "EXPENSES_FOLDER", name: "Administrative Expenses", balance: 558.61, children: [{ id: "acc.0ed5fc81-7734-4452-86a9-db22a6b0f8e8", type: "EXPENSE", name: "Bank Charges", balance: 15, children: [] }, { id: "acc.e2cdb2c0-8565-4991-a35a-d4596b0ddf45", type: "EXPENSE", name: "Software & Computer Peripherals", balance: 417.13, children: [] }, { id: "acc.96d5d00e-43f4-4d3a-b97b-fdf258c65514", type: "EXPENSE", name: "Printing, photocopying etc", balance: 55.93, children: [] }, { id: "acc.494dd64a-4fb3-42b8-be3e-8f3b59a2ef59", type: "EXPENSE", name: "Artists Administration Service", balance: 0, children: [] }, { id: "acc.1260446672238.35", type: "EXPENSE", name: "Stationery", balance: 0, children: [] }, { id: "acc.96d89d0d-5465-488b-b37f-d41ca114c5e6", type: "EXPENSE", name: "Mobile Telephone", balance: 41.19, children: [] }, { id: "acc.1260446672238.33", type: "EXPENSE", name: "Home Telephone", balance: 0, children: [] }, { id: "acc.1260446672238.38", type: "EXPENSE", name: "Postage/delivery", balance: 29.36, children: [] }] }, { id: "acc.b9c9bbc7-43df-472e-9ac8-c7c76f08f49a", type: "EXPENSES_FOLDER", name: "Instruments, Equipment Maintenance etc", balance: 1002.48, children: [{ id: "acc.1260446672238.32", type: "OTHER_EXPENSES", name: "Instrument Insurance", balance: 157.48, children: [] }, { id: "acc.2a1cca15-2868-4770-a3e7-d43a6268c6a1", type: "EXPENSE", name: "Instrument Repairs & Maintenance", balance: 845, children: [] }, { id: "acc.a908aee0-84fb-450a-916b-4cec25265aef", type: "EXPENSE", name: "Accessories & Replacement Parts", balance: 0, children: [] }] }, { id: "acc.a42cdd86-0d9e-4f3f-af0d-7c4525374731", type: "EXPENSES_FOLDER", name: "Motor Vehicle", balance: 0, children: [{ id: "acc.cb325e7e-0ce4-4c78-9cb4-20659df733a6", type: "EXPENSE", name: "Fuel and Oil", balance: 0, children: [] }] }, { id: "acc.4bdd9e26-ce64-4e7f-b46a-82ec9de06ded", type: "EXPENSES_FOLDER", name: "Other Travel", balance: 132.1, children: [{ id: "acc.77dd2142-f2de-4a2c-9247-061d0661bc0a", type: "EXPENSE", name: "Taxis", balance: 24.5, children: [] }, { id: "acc.2b54abdd-7ef5-43cd-bdb9-c8c981b59ff2", type: "EXPENSE", name: "Public Transport", balance: 107.6, children: [] }] }, { id: "acc.e4695b70-31fa-4e23-afd0-97335dcd5b9e", type: "EXPENSE", name: "Subsitence", balance: 0, children: [] }, { id: "acc.02d222bf-4dff-4308-afe9-69b93f412ada", type: "EXPENSE", name: "Hotel and Accomodation", balance: 0, children: [] }, { id: "acc.d61cd5b4-2c80-4ab8-93d0-9d5726bd253b", type: "EXPENSES_FOLDER", name: "Fees and Commission Paid", balance: 0, children: [{ id: "acc.1262189019758.7", type: "EXPENSE", name: "Pupils exam entry fees", balance: 0, children: [] }, { id: "acc.a7d7efd3-d0da-4704-babb-079b6077f3fe", type: "EXPENSE", name: "Audition, competition entry fees", balance: 0, children: [] }, { id: "acc.3b91ee4e-40a8-46d8-aa05-3afa5974b3ef", type: "EXPENSE", name: "Deputies, Other Musicians", balance: 0, children: [] }] }, { id: "acc.250d6872-6023-4599-a0b6-b7159eebbfa1", type: "EXPENSES_FOLDER", name: "Other Professional Expenses", balance: 1739.42, children: [{ id: "acc.b7315228-f85a-4ffb-9199-d1128a409e5f", type: "EXPENSE", name: "Promotion & Publicity", balance: 138.6, children: [] }, { id: "acc.69ca2005-d7a0-448b-b70c-dafb128a48ae", type: "EXPENSE", name: "Other Expenses", balance: 364.5, children: [] }, { id: "acc.dcd999d2-4e18-41be-b9cc-218d4034b88e", type: "EXPENSE", name: "Office Equipment, Furniture", balance: 0, children: [] }, { id: "acc.e0460706-d5c9-4c40-9d1e-0d2058864b92", type: "EXPENSE", name: "CDs, Dowloads etc", balance: 67.57, children: [] }, { id: "acc.1866df79-9e44-459a-a978-727904987469", type: "EXPENSE", name: "Professional Books, Magazines", balance: 104.01, children: [] }, { id: "acc.24c1651d-e7ae-48bc-a32d-311427e0fcea", type: "EXPENSE", name: "Professional Associations", balance: 272.17, children: [] }, { id: "acc.289ab0ac-b9d3-435e-ac82-9da9702b7d4b", type: "EXPENSE", name: "Tuition", balance: 470, children: [] }, { id: "acc.f24cf99b-6291-4b9f-821e-425f4909d4e1", type: "EXPENSE", name: "Scores, Manuscript Paper etc", balance: 215.32, children: [] }, { id: "acc.1af95953-56f0-455e-9d0a-7c4e0477cf0d", type: "EXPENSE", name: "Performance Clothing", balance: 0, children: [] }, { id: "acc.c0585577-535a-4ae2-a02b-e5b249f67c67", type: "EXPENSE", name: "Concerts, Shows etc", balance: 107.25, children: [] }] }, { id: "acc.1260446672222.24", type: "ADMIN", name: "Administrative Expenses", balance: 0, children: [] }, { id: "acc.1260446672238.26", type: "TRAVEL", name: "Travel and Subsistence Account", balance: -14.5, children: [] }, { id: "acc.1260446672238.28", type: "LEGAL", name: "Legal and Professional Costs Account", balance: 0, children: [] }, { id: "acc.1260446672238.36", type: "OTHER_EXPENSES", name: "Rent/Rates", balance: 0, children: [] }, { id: "acc.1262191376548.37", type: "EXPENSE", name: "Research", balance: 0, children: [] }, { id: "acc.1262191388329.38", type: "EXPENSE", name: "Professional Development", balance: 0, children: [] }, { id: "acc.1262192291558.52", type: "EXPENSE", name: "Professional Presentation", balance: 0, children: [] }, { id: "acc.1262193596634.72", type: "EXPENSE", name: "Subscriptions", balance: 0, children: [] }, { id: "acc.1262265941130.16", type: "EXPENSE", name: "Piano accompaniment", balance: 0, children: [] }, { id: "acc.1267370824329.1", type: "EXPENSE", name: "Cost of Sales", balance: 0, children: [] }] }],
    result = flat(data);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

这篇关于展平深层嵌套的对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆