美文网首页
Javascript 数组转无限级分类(非递归)

Javascript 数组转无限级分类(非递归)

作者: 伍源辉 | 来源:发表于2017-02-09 17:55 被阅读58次
<script type="text/javascript">
var arr = [
    {"id":1,"parent_id":0,"name":"Foods"},
    {"id":2,"parent_id":1,"name":"Fruits"},
    {"id":3,"parent_id":2,"name":"apple"},
    {"id":4,"parent_id":2,"name":"orange"},
    {"id":5,"parent_id":2,"name":"tomato"},
    {"id":6,"parent_id":1,"name":"Vegetables"},
    {"id":7,"parent_id":6,"name":"carrot"},
    {"id":8,"parent_id":6,"name":"cabbage"},
    {"id":9,"parent_id":6,"name":"potato"},
    {"id":10,"parent_id":6,"name":"lettuce"},
    {"id":11,"parent_id":0,"name":"Cars"}
];

function convert(rows){
    // 判断传入的父类ID是否在数组里面
    function exists(rows, parent_id){
        for(var i=0; i<rows.length; i++){
            if (rows[i].id == parent_id)
                return true;
        }
        return false;
    }
    
    var nodes = [];
    // 获取所有一级分类
    for(var i=0; i<rows.length; i++){
        var row = rows[i];
        if (!exists(rows, row.parent_id)){
            nodes.push({
                id:row.id,
                text:row.name
            });
        }
    }
    
    // 将一级分类放入待处理数组中
    var toDo = [];
    for(var i=0; i<nodes.length; i++){
        toDo.push(nodes[i]);
    }
    while(toDo.length){
        // 逐个弹出
        var node = toDo.shift();
        // 查找它的下级分类
        for(var i=0; i<rows.length; i++){
            var row = rows[i];
            // 如果是它的下级分类则放入 children 数组中
            if (row.parent_id == node.id){
                var child = {id:row.id,text:row.name};
                if (node.children){
                    node.children.push(child);
                } else {
                    node.children = [child];
                }
                // 将当前分类放入待处理数组中
                toDo.push(child);
            }
        }
    }
    return nodes;
}

console.log(convert(arr));
</script>

相关文章

网友评论

      本文标题:Javascript 数组转无限级分类(非递归)

      本文链接:https://www.haomeiwen.com/subject/xjlwittx.html