递归地在javascript数组中查找子元素

时间:2017-11-24 13:01:58

标签: javascript

我想从下面的列表中提取特定父节点的子元素。 这些元素将按升序排列。

arr = [
    '1',
    '1.1',
    '2',
    '2.1',
    '2.2',
    '2.3',
    '2.4',
    '3',
    '3.1',
    '3.2',
    '3.2.1',
    '3.2.2',
    '3.3',
    '3.4',
    '3.5',
    '3.6',
    '3.7',
    '3.7.1',
    '3.7.2'
];

对于每个元素,我想要这种格式的东西。

parsed = [
    {id: '3', childrens:[
        {id:'3.1', childrens: [] },
        {id:'3.2', childrens: [
            {id:'3.2.1', childrens: [] },
            {id:'3.2.2', childrens: [] }
        ] },
        {id:'3.3', childrens: [] },
        {id:'3.4', childrens: [] },
        {id:'3.5', childrens: [] },
        {id:'3.6', childrens: [] },
        {id:'3.7', childrens: [
            {id:'3.7.1', childrens: [] },
            {id:'3.7.2', childrens: [] }
        ] }
    ]}
];

我想将解析后的JSON传递给Tree Grid。 我试着为它写一个函数

function getChilds (str){

    if(arr[arr.length - 1]+'.' === str)
        return;

    var childs = [];

    var task = new Object();

    for(var i = 0 ; i < arr.length ; i++ ){
        if( arr[i].localeCompare(str) > 0 ){
            task.id=arr[i];
            childs.push(task);
            tasks.push(task);
            console.log(tasks);
        }
    }
};

1 个答案:

答案 0 :(得分:0)

您可以获取给定的字符串,按点拆分并将值作为嵌套哈希表的路径,从而使组保持相同的级别。

如果找到新级别,则会创建一个新对象并将其插入到哈希表中。

结果,您将获得一个具有嵌套对象的数组,该数组包含所有子数组。

结果集的顺序受给定数据顺序的影响。

&#13;
&#13;
var data = ['1', '1.1', '2', '2.1', '2.2', '2.3', '2.4', '3', '3.1', '3.2', '3.2.1', '3.2.2', '3.3', '3.4', '3.5', '3.6', '3.7', '3.7.1', '3.7.2'],
    result = function (array) {
        var result = [],
            hash = { _: result };

        array.forEach(function (a) {
            a.split('.').reduce(function (r, k) {
                if (!r[k]) {
                    r[k] = { _: [] };
                    r._.push({ id: a, children: r[k]._ });
                }
                return r[k];
            }, hash);
        });
        return result;
    }(data);

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