我试着写这样的功能:

Input:

['A', '-B1', '--B2', '-C1', 'D']

Output:

{'A': {'B1': {'B2': {}}, 'C1': {}}, 'D': {}}

正如你所见,B1和C1是A的子代,B2是B1的子代.它可以在100的基础上进行任何级别的嵌套

我写了一个Javascript代码,但是当创建子元素的时候,它似乎出了问题.这是我的代码:

function fetch_levels(li, chr='-') {
    var res_list = []
    for (i=0; i<li.length; i++) {
        item = li[i]
        level = item.length - item.replace(RegExp(`^${chr}+`), '').length
        key = item.replace(RegExp(`^${chr}+`), '')
        value = {}
        res_list.push({
            level: level,
            name: key,
            value: value
        })
    }
    return res_list
}

function ttree_to_json(ttree, level=0) {
    result = {}
    for (i = 0; i < ttree.length; i++) {
        cn = ttree[i]
        nn = ttree[i+1] || {'level': -1}

        // Edge cases
        if (cn['level'] > level) {
            continue
        }
        if (cn['level'] < level) {
            return result
        }

        // Recursion
        if (nn['level'] == level) {
            result[cn['name']] = cn['value']
        } else if (nn['level'] > level) {
            rr = ttree_to_json(ttree.slice(i+1), level=nn['level'])
            result[cn['name']] = rr
        }
        else {
            result[cn['name']] = cn['value']
            return result
        }
    }
    return result
}

And this is how the functions can be invoked:

console.log(ttree_to_json(fetch_levels(['A', '-B1', '--B2', '-C', 'D'])))

And the output I got is something like:

Object { B2: {…}, C: {} }

这是错误的.

Can any help me to figure out what is wrong with the JavaScript code?

该解决方案的灵感来源于here:中提到的示例代码

编辑(2022年5月11日)

我的错是我没有给出真正的问题.为了使问题更简短、更精确,我给出了不同的数据 struct .这里给出的所有答案都适用于上述DS.但我无法使我的实际DS获得所需的输出.

Here is the actual input:

[
    {
        "componentId": "1067256",
        "componentName": "Readiness",
        "shortHandName": "GTM"
    },
    {
        "componentId": "1067343",
        "componentName": "-Business Planning and Commercialization - BPC",
        "shortHandName": "BPC"
    },
    {
        "componentId": "1068213",
        "componentName": "-SKU Life Cycle Management (SLM)",
        "shortHandName": "SLM"
    },
    {
        "componentId": "1068210",
        "componentName": "--Partner Programs",
        "shortHandName": "Partner"
    },
    {
        "componentId": "1067317",
        "componentName": "--Activation",
        "shortHandName": "Activation"
    },
    {
        "componentId": "1067346",
        "componentName": "Sales Compensation",
        "shortHandName": "Sales Comp"
    }
]

Expected output:

{
    "GTM": {
        "componentId": "1067256",
        "componentName": "Readiness",
        "shortHandName": "GTM",
        "children": {
            "BPC": {
                "componentId": "1067343",
                "componentName": "Business Planning and Commercialization - BPC",
                "shortHandName": "BPC",
                "children": {
                    "Partner": {
                        "componentId": "1068210",
                        "componentName": "Partner Programs",
                        "shortHandName": "Partner",
                        "children": {}
                    },
                    "Activation": {
                        "componentId": "1067317",
                        "componentName": "Activation",
                        "shortHandName": "Activation",
                        "children": {}
                    }
                }
            },
            "SLM": {
                "componentId": "1068213",
                "componentName": "SKU Life Cycle Management (SLM)",
                "shortHandName": "SLM",
                "children": {}
            }
        }
    },
    "Sales Comp": {
        "componentId": "1067346",
        "componentName": "Sales Compensation",
        "shortHandName": "Sales Comp",
        "children": {}
    }
}

Explanation:

  • 使用componentName,父级和子级关系(或级别)基于-决定,-可以是任何嵌套级别.
  • shortHandName用作键,作为对象的值应包含所有属性,包括新添加的属性children
  • children将具有相同的 struct ,最低级别的子元素将具有{}.

对我来说,很难理解所有的答案,所以我可以让它们适用于我提到的新DS.

推荐答案

可以通过为嵌套对象的级别引用获取数组来简化代码.

任何属性都被指定给给定的级别(破折号计数),并将对象带到下一个级别.

const
    data = ['A', '-B1', '--B2', '-C1', 'D'],
    result = {},
    levels = [result];
    
data.forEach(s => {
    let level = 0;
    while (s[level] === '-') level++;
    s = s.slice(level);
    levels[level][s] = levels[level + 1] = {};
});

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

现实世界问题的解决方案

const
    data = [{ componentId: "1067256", componentName: "Readiness", shortHandName: "GTM" }, { componentId: "1067343", componentName: "-Business Planning and Commercialization - BPC", shortHandName: "BPC" }, { componentId: "1068213", componentName: "-SKU Life Cycle Management (SLM)", shortHandName: "SLM" }, { componentId: "1068210", componentName: "--Partner Programs", shortHandName: "Partner" }, { componentId: "1067317", componentName: "--Activation", shortHandName: "Activation" }, { componentId: "1067346", componentName: "Sales Compensation", shortHandName: "Sales Comp" }],
    getLevel = string => string[0] === '-'
        ? 1 + getLevel(string.slice(1))
        : 0,
    result = data
        .reduce((levels, o) => {
            const level = getLevel(o.componentName);
            levels[level][o.shortHandName] = { ...o, children: levels[level + 1] = {} };
            return levels;
        }, [{}])
        [0];

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

Javascript相关问答推荐

无法访问Vue 3深度监视器中对象数组的特定对象值'

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

当id匹配时对属性值求和并使用JavaScript返回结果

JQuery Click事件不适用于动态创建的按钮

JavaScript是否有多个`unfined`?

DOM不自动更新,尽管运行倒计时TS,JS

第一项杀死下一项,直到数组长度在javascript中等于1

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

在Java脚本中录制视频后看不到曲目

FireBase FiRestore安全规则-嵌套对象的MapDiff

AG-GRIDreact 显示布尔值而不是复选框

bootstrap S JS赢得了REACT中的函数/加载

鼠标进入,每秒将图像大小减小5%

如何使用Reaction/Redux创建购物车逻辑?

Chartjs 2.7.2,数据集的堆叠折线图背景 colored颜色 重叠

从Java到Java的Port Inn代码验证

在克隆和不克隆原始列表的情况下将元素添加到数组的最佳方法

react setState不保留以前的状态

如何合并对象列表中的连续重复值?

使用关键帧的CSS动画未按预期工作