javascript - 修改代码 使用递归

查看:108
本文介绍了javascript - 修改代码 使用递归的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

function arrToJson(flieds, arr) {
        var map = {},
                dest = [];
        for (var i = 0; i < arr.length; i++) {
            var ai = arr[i]; 
            if (!map[ai[flieds[0]]]) {
                var obj = {};
                dest.push({
                    name: ai[flieds[0]],
                    data: [ai]
                });
                map[ai.hdata_type] = ai; 
            } else {
                for (var j = 0; j < dest.length; j++) {
                    var dj = dest[j];
                    if (dj.name == ai[flieds[0]]) {
                        dj.data.push(ai);
                        break;
                    }
                }
            }
        }


        for (var i = 0, dest_len = dest.length; i < dest_len; i++) {
            var map1 = {},
                    dest1 = [];
            for (var x = 0, len = dest[i].data.length; x < len; x++) {
                var ai = dest[i].data[x];
                if (!map1[ai[flieds[1]]]) {
                    dest1.push({
                        name: ai.disaster_type,
                        data: [ai]
                    });
                    map1[ai[flieds[1]]] = ai;
                } else {
                    for (var j = 0; j < dest1.length; j++) {
                        var dj = dest1[j];
                        if (dj.name == ai[flieds[1]]) {
                            dj.data.push(ai);

                            break;
                        }
                    }
                }
            }
            dest[i].data = dest1;
        }


        for (var i = 0, dest_len = dest.length; i < dest_len; i++) {
            for (var x = 0, dest1_len = dest[i].data.length; x < dest1_len; x++) {
                var map2 = {},
                        dest2 = [];
                for (var y = 0, len = dest[i].data[x].data.length; y < len; y++) {
                    var ai = dest[i].data[x].data[y];
                    if (!map2[ai[flieds[2]]]) {
                        dest2.push({
                            name: ai[flieds[2]],
                            data: [ai]
                        });
                        map2[ai.hazard_type] = ai;
                    } else {
                        for (var j = 0; j < dest2.length; j++) {
                            var dj = dest2[j];
                            if (dj.name == ai[flieds[2]]) {
                                dj.data.push(ai);

                                break;
                            }
                        }
                    }
                }
                dest[i].data[x].data = dest2;
            }
        }

        return dest;
    }
    
 var flieds = ['hdata_type', 'disaster_type', 'hazard_type'];
 var result = arrToJson(flieds, datacatalog);

之前是用固定的参数,现在需要动态选择所需要的参数,所以要用到递归,但是弄了两个多小时没弄出来,求大神

解决方案

自己解答好啦,方案一:

var m=0;

function arrToJson(flieds, arr) {
        var map = {},
                destX = [];
        for (var i = 0; i < arr.length; i++) {
            var ai = arr[i];
            if (!map[ai[flieds[m]]]) {
                var obj = {};
                destX.push({
                    name: ai[flieds[m]],
                    data: [ai]
                });
                map[ai[flieds[m]]] = ai;
            } else {

                for (var j = 0; j < destX.length; j++) {
                    var dj = destX[j];
                    if (dj.name == ai[flieds[m]]) {
                        dj.data.push(ai);
                        break;
                    }
                }
            }
            if(i===arr.length-1){
                m++;
                if(m<flieds.length){
                    for(var x= 0,len=destX.length;x<len;x++){
                        destX[x].data=arrToJson(flieds,destX[x].data);
                    }
                }else if(m===flieds.length){
                    for(var x= 0,len=destX.length;x<len;x++){
                        destX[x].data=[];
                    }
                }
                m--;
            }
        }
        return destX;
}
    var flieds = ['hdata_type', 'disaster_type', 'hazard_type','hazard_table_name'];
    var dest = arrToJson(flieds, datacatalog);

方案二:

function fun(data) {
        if (data.length < 1) {
            return false;
        }
        var d0 = data[0];
        var keys = [];
        for (var k in d0) {
            if (k !== 'data') {
                keys.push(k);
            }
        }
        if (keys.length <= 1) {
            return false;
        }
        var k_last = keys[keys.length - 1];
        var k_near_last = keys[keys.length - 2];
        var returnData = [], currentObj;
        for (var i = 0, len = data.length; i < len; i++) {
            if (!currentObj || currentObj[k_near_last] !== data[i][k_near_last]) {
                currentObj = {};
                for (var k = 0, k_len = keys.length - 1; k < k_len; k++) {
                    currentObj[keys[k]] = data[i][keys[k]];
                }
                currentObj['data'] = [{
                    name: data[i][k_last],
                    data: ('data' in data[i]) ? data[i].data : []
                }];
                returnData.push(currentObj);
            }
            else if (currentObj[k_near_last] === data[i][k_near_last]) {
                currentObj['data'].push({
                    name: data[i][k_last],
                    data: ('data' in data[i]) ? data[i].data : []
                });
            }
        }
        return returnData; 
}

             var r = fun(datacatalog), over, over_data = [], last_key;
            while (r) {
                over = r;
                r = fun(r);
            }
            for (var ok in over[0]) {
                if (ok !== 'data') {
                    last_key = ok;
                    break;
                }
            }
            for (var j = 0, j_len = over.length; j < j_len; j++) {
                over_data.push({name: over[j][last_key], data: over[j]['data']});
            }
console.log(over_data);
console.log(dest);


原始数据图:

效果图:

这篇关于javascript - 修改代码 使用递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆