给出3列/节点的树

时间:2018-04-18 18:31:29

标签: javascript

第一个问题,抱歉,如果我错过了一些礼仪。我正在尝试构建一个具有3个依赖关系的树,我之前已成功构建了“父,子”树,但添加第3列让我头疼。

我有一组包含3个属性的对象:

{Ref:1.1, Home: 1, City: City1}
{Ref:2.1, Home: 2, City: City2}
{Ref:1.2, Home: 1, City: City1}
{Ref:1.3, Home: 1, City: City1}
{Ref:2.2, Home: 2, City: City2}
{Ref:2.3, Home: 2, City: City2}

需要构建一个结构与此类似的树:

{City: City1, Nodes{Home: 1, Nodes{Ref: 1.1,1.2,1.3}}
{City: City2, Nodes{Home: 2, Nodes{Ref: 2.1,2.2,2.3}}

正如我所说,我可以通过使用类似于此的功能将Homes放入城市中:

function getNestedChildren(arr, parent) 
        {
        var out = [];       
                for(var i=0;i<arr.length;i++) {

                    if(arr[i].parent == parent) {
                         var children = getNestedChildren(arr, arr[i].name)


                            if(children.length) {
                            arr[i].children = children
                            }
                                  out.push(arr[i])
                        }         
                    }
                return out    
        }

但我不确定如何考虑树的第三个属性。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用带有组的数组来查找对象的数据,并查看组是否存在并使用它或创建新组并将其推送到级别数组。

这适用于任意数量的组。

var data = [{ Ref: '1.1', Home: '1', City: 'City1' }, { Ref: '2.1', Home: '2', City: 'City2' }, { Ref: '1.2', Home: '1', City: 'City1' }, { Ref: '1.3', Home: '1', City: 'City1' }, { Ref: '2.2', Home: '2', City: 'City2' }, { Ref: '2.3', Home: '2', City: 'City2' }];
    groups = ['City', 'Home', 'Ref'],
    result = [];

data.forEach(function (object) {
    groups.reduce(function (level, key) {
        var temp = level.find((l) => object[key] === l[key]);
        if (!temp) {
            temp = { [key]: object[key], nodes: [] };
            level.push(temp);
        }
        return temp.nodes;
    }, result);
});

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

如果您不希望最深层次的节点数组,则只能在最后一级之前的级别使用nodes

var data = [{ Ref: '1.1', Home: '1', City: 'City1' }, { Ref: '2.1', Home: '2', City: 'City2' }, { Ref: '1.2', Home: '1', City: 'City1' }, { Ref: '1.3', Home: '1', City: 'City1' }, { Ref: '2.2', Home: '2', City: 'City2' }, { Ref: '2.3', Home: '2', City: 'City2' }];
    groups = ['City', 'Home', 'Ref'],
    result = [],
    nestedGroups = groups.slice(0, -1),
    last = groups.slice(-1);

data.forEach(function (object) {
    nestedGroups.reduce(function (level, key) {
        var temp = level.find((l) => object[key] === l[key]);
        if (!temp) {
            temp = { [key]: object[key], nodes: [] };
            level.push(temp);
        }
        return temp.nodes;
    }, result).push({ [last]: object[last] });
});

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