javascript - 根据对象的 id 创建一个新的对象数组

标签 javascript lodash

我需要根据列表中的 parent_id 将对象数组转换为新数组。在下面给定的输入中,我们有一个 parent_id,它告诉给定对象的使用父级。

输入:

[
  {
    "id": 1,
    "title": "Item 1",
    "parent_id": null
  },
  {
    "id": 2,
    "title": "Item 2",
    "parent_id": 1
  },
  {
    "id": 3,
    "title": "Item 3",
    "parent_id": 2
  },
  {
    "id": 4,
    "title": "Item 4",
    "parent_id": null
  },
  {
    "id": 5,
    "title": "Item 5",
    "parent_id": null
  },
  {
    "id": 6,
    "title": "Item 6",
    "parent_id": 5
  },
  {
    "id": 7,
    "title": "Item 7",
    "parent_id": 6
  },
  {
    "id": 8,
    "title": "Item 8",
    "parent_id": 6
  }
]

期望的输出:

[
  {
    "id": 1,
    "title": "Item 1",
    "parent_id": null,
    "child": [{
        "id": 2,
        "title": "Item 2",
        "parent_id": 1,
        "child": [{
            "id": 3,
            "title": "Item 3",
            "parent_id": 2
        }]
    }]
  },
  {
    "id": 4,
    "title": "Item 4",
    "parent_id": null
  },
  {
    "id": 5,
    "title": "Item 5",
    "parent_id": null,
    "child": [{
        "id": 6,
        "title": "Item 6",
        "parent_id": 5,
        "child": [{
            "id": 7,
            "title": "Item 7",
            "parent_id": 6
        }, {
            "id": 8,
            "title": "Item 8",
            "parent_id": 6
        }]
    }]
  }
]

在所需的输出中,我创建了一个嵌套的对象数组,其中每个对象都将包含其子对象。 有人可以建议我们如何在 javascript 中执行此操作吗?

最佳答案

只需循环并在对象的帮助下构建一棵树。

var data = [{ id: 1, title: "Item 1", parent_id: null }, { id: 2, title: "Item 2", parent_id: 1 }, { id: 3, title: "Item 3", parent_id: 2 }, { id: 4, title: "Item 4", parent_id: null }, { id: 5, title: "Item 5", parent_id: null }, { id: 6, title: "Item 6", parent_id: 5 }, { id: 7, title: "Item 7", parent_id: 6 }, { id: 8, title: "Item 8", parent_id: 6 }],
    tree = function (data, root) {
        var t = {};
        data.forEach(o => {
            Object.assign(t[o.id] = t[o.id] || {}, o);
            t[o.parent_id] = t[o.parent_id] || {};
            t[o.parent_id].children = t[o.parent_id].children || [];
            t[o.parent_id].children.push(t[o.id]);
        });
        return t[root].children;
    }(data, null);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 根据对象的 id 创建一个新的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454355/

相关文章:

javascript - 如何使用 jquery 验证所需的标题字段集?

javascript - 如何使用 SVG 的一个元素来更改同一 SVG 中另一个元素的不透明度?

javascript - 如何使用 highcharts 创建自定义按钮,每个数据按钮为其数据调用另一个 php 脚本

php - 使用 PHP 缩小 CSS 和 JavaScript 文件

javascript - 如何检查对象中的字符串在数组中是否唯一

javascript - lodash 将对象数据添加到数组

javascript - Bootstrap-datetimepicker 选择过去几个月

javascript - Lodash 返回键如果存在,否则返回另一个键

vue.js - 在使用 Lodash 对 Vue 中的搜索请求进行去抖动时无法访问它?

javascript - 从多个数据源(json)搜索