【问题标题】:Nest array of objects by hierarchy level JavaScript/TypeScript按层级 JavaScript/TypeScript 嵌套对象数组
【发布时间】:2018-04-11 11:43:44
【问题描述】:

我有一个类似于下面的数据集:

dataSet = {rows: [
    {"ID":0, "Value":10, "HIERARCHY_LEVEL":1},
    {"ID":1, "Value":20, "HIERARCHY_LEVEL":2},
    {"ID":2, "Value":55, "HIERARCHY_LEVEL":3},
    {"ID":3, "Value":77, "HIERARCHY_LEVEL":2},
    {"ID":4, "Value":29, "HIERARCHY_LEVEL":3},
    {"ID":5, "Value":44, "HIERARCHY_LEVEL":4},
    {"ID":6, "Value":34, "HIERARCHY_LEVEL":5},
    {"ID":7, "Value":56, "HIERARCHY_LEVEL":4},
    {"ID":8, "Value":23, "HIERARCHY_LEVEL":2},
    {"ID":9, "Value":23, "HIERARCHY_LEVEL":3},
    {"ID":10, "Value":23, "HIERARCHY_LEVEL":1},
    {"ID":11, "Value":23, "HIERARCHY_LEVEL":2},
    {"ID":12, "Value":23, "HIERARCHY_LEVEL":2},
    {"ID":13, "Value":23, "HIERARCHY_LEVEL":3},
]}

我想按层级重新排列这个dataSet,所以每个层级都放入前一个对象的children属性数组中,如下所示:

注意:数据集按原样(按顺序)加载。此外,是否所有对象都具有children 属性并不重要。

(我已尝试将其格式化以便于阅读)

newDataSet = [
    {"ID":0, "Value":10, "HIERARCHY_LEVEL":1, "children":[
        {"ID":1, "Value":20, "HIERARCHY_LEVEL":2, "children":[
            {"ID":2, "Value":55, "HIERARCHY_LEVEL":3}
        ]},
        {"ID":3, "Value":77, "HIERARCHY_LEVEL":2, "children":[
            {"ID":4, "Value":29, "HIERARCHY_LEVEL":3, "children":[
                {"ID":5, "Value":44, "HIERARCHY_LEVEL":4, "children":[
                    {"ID":6, "Value":34, "HIERARCHY_LEVEL":5}
                ]},
                {"ID":7, "Value":56, "HIERARCHY_LEVEL":4}
            ]}
        ]},
        {"ID":8, "Value":23, "HIERARCHY_LEVEL":2, "children":[
            {"ID":9, "Value":23, "HIERARCHY_LEVEL":3}
        ]}
    ]},
    {"ID":10, "Value":23, "HIERARCHY_LEVEL":1, "children":[
        {"ID":11, "Value":23, "HIERARCHY_LEVEL":2},
        {"ID":12, "Value":23, "HIERARCHY_LEVEL":2, "children":[
            {"ID":13, "Value":23, "HIERARCHY_LEVEL":3}
        ]}
    ]}
]

编辑

我当前的代码

let newResults = [];
let topHierarchyLevel = 1;
let resultCounter = (newResults.length - 1); //Get the 2nd last element of newResults
let currentLevel = 2;
let loopCounter = 0;
for (loopCounter; loopCounter < dataSet.rows.length; loopCounter++) {
    let row = dataSet.rows[loopCounter];
    row["children"] = [];
    if (row.HIERARCHY_LEVEL == topHierarchyLevel) {
        newResults.push(row);
        resultCounter++;
    } else {
        if (row.HIERARCHY_LEVEL == 2) {
            newResults[resultCounter].children.push(row);
            currentLevel++;
        } else if (row.HIERARCHY_LEVEL > 2) {
            newResults[resultCounter-1].children.children.push(row);
            currentLevel++;
            resultCounter++;
        } else {
            currentLevel--;
            resultCounter--;
            loopCounter--;
        }
    }
}

【问题讨论】:

  • ...您有问题吗? SO 不是代码编写服务。
  • @jonrsharpe 您将如何遍历每个级别并将其添加到相应的层次结构级别?
  • 你到底坚持哪一部分?例如,您知道如何遍历数组吗?如果没有,介绍性教程将比 SO 问题更合适。请提供minimal reproducible example 显示您尝试过的内容以及您必须到达的确切位置。
  • 是的,我能够遍历数组并找到我当前所在的层次结构。但是,随着级别的进行,我无法将该行添加到嵌套的 children 属性中

标签: javascript arrays typescript object


【解决方案1】:

您可以使用 level 属性 HIERARCHY_LEVEL 来指示辅助数组中的嵌套位置。

如果需要,然后迭代数据并构建子数组。

function getTree(array) {
    var levels = [{}];
    array.forEach(function (o) {
        levels.length = o.HIERARCHY_LEVEL;
        levels[o.HIERARCHY_LEVEL - 1].children = levels[o.HIERARCHY_LEVEL - 1].children || [];
        levels[o.HIERARCHY_LEVEL - 1].children.push(o);
        levels[o.HIERARCHY_LEVEL] = o;
    });
    return levels[0].children;
}

var data = [{ ID: 0, Value: 10, HIERARCHY_LEVEL: 1 }, { ID: 1, Value: 20, HIERARCHY_LEVEL: 2 }, { ID: 2, Value: 55, HIERARCHY_LEVEL: 3 }, { ID: 3, Value: 77, HIERARCHY_LEVEL: 2 }, { ID: 4, Value: 29, HIERARCHY_LEVEL: 3 }, { ID: 5, Value: 44, HIERARCHY_LEVEL: 4 }, { ID: 6, Value: 34, HIERARCHY_LEVEL: 5 }, { ID: 7, Value: 56, HIERARCHY_LEVEL: 4 }, { ID: 8, Value: 23, HIERARCHY_LEVEL: 2 }, { ID: 9, Value: 23, HIERARCHY_LEVEL: 3 }, { ID: 10, Value: 23, HIERARCHY_LEVEL: 1 }, { ID: 11, Value: 23, HIERARCHY_LEVEL: 2 }, { ID: 12, Value: 23, HIERARCHY_LEVEL: 2 }, { ID: 13, Value: 23, HIERARCHY_LEVEL: 3 }];

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

【讨论】:

  • 感谢您的回复。问题:为什么参数level 在getTree 函数上传递,因为我认为它没有被使用?另外,当我尝试运行它时,我收到错误 Property children does not exist on type '{}',你知道为什么吗?
  • 该参数是尝试使用变量作为级别键的剩余参数。另一个问题不应该发生在以 1 开头的级别并且所有级别都没有漏洞,例如 5 级别之后是 3 级别,没有级别 4。
猜你喜欢
  • 2019-03-21
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多