javascript - 修改代码 使用递归
本文介绍了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屋!
查看全文