我有如下所示的二维数组
var testData = [
["level-1", "level-2", "level-3", 109], // goes to level-n
["level-1", "level-2", "level-3", 25], // goes to level-n
["level-1", "level-2", "level-3", 20], // goes to level-n
["level-1", "level-2", "level-3", 17], // goes to level-n
]; 我需要把它转换成下面的结构
var resultData = [{
"name": "level-1",
"sub-name": [{
"name": "level-2",
"sub-name": [{
"name": "level-3",
"val": 109
}]
}]
}, {
"name": "level-1",
"sub-name": [{
"name": "level-2",
"sub-name": [{
"name": "level-3",
"val": 25
}]
}]
}, {
"name": "level-1",
"sub-name": [{
"name": "level-2",
"sub-name": [{
"name": "level-3",
"val": 20
}]
}]
}, {
"name": "level-1",
"sub-name": [{
"name": "level-2",
"sub-name": [{
"name": "level-3",
"val": 17
}]
}]
}];我试过以下几种方法,但是它缺少级别-1和显示级别-3而不是级别-2。
var testData = [
["level-1", "level-2", "level-3", 109], // goes to level-n
["level-1", "level-2", "level-3", 25], // goes to level-n
["level-1", "level-2", "level-3", 20], // goes to level-n
["level-1", "level-2", "level-3", 17], // goes to level-n
];
var index = 3;
var testArray = [];
function converter(d) {
d.forEach(function(b) {
recursive(b, 0);
});
}
function recursive(element, i, testObj) {
testObj = testObj || {};
testObj.name = element[i];
testObj.category = element[i];
testObj.subCategory = [{}];
++i;
if (i < index) {
recursive(element, i, testObj);
}
if (i == index) {
testObj.subCategory[0].name = element[index - 1];
testObj.subCategory[0].val = element[index];
testObj.subCategory[0].subCategory = null;
return testObj;
}
document.write('<pre>' + JSON.stringify(testObj, 0, 4) + '</pre>');
}
converter(testData);
发布于 2015-12-17 19:47:42
下面是这个问题的迭代解决方案:
var testData = [
["level-1", "level-2", "level-3", 109], // goes to level-n
["level-1", "level-2", "level-3", 25], // goes to level-n
["level-1", "level-2", "level-3", 20], // goes to level-n
["level-1", "level-2", "level-3", 17], // goes to level-n
],
resultData= [];
testData.forEach(function(a) {
var obj = {};
resultData.push(obj);
a.forEach(function(val, idx) {
if(idx < a.length - 2) {
obj.name= val;
obj['sub-name']= [{}];
obj= obj['sub-name'][0];
}
else {
obj.name= a[idx - 1];
obj.val= val;
}
});
});
document.body.innerHTML= '<pre>'+JSON.stringify(resultData, null, 2)+'</pre>';
发布于 2015-12-17 19:41:32
我相信这就是你要找的:
var testData = [
["level-1", "level-2", "level-3", 109], // goes to level-n
["level-1", "level-2", "level-3", 25], // goes to level-n
["level-1", "level-2", "level-3", 20], // goes to level-n
["level-1", "level-2", "level-3", 17], // goes to level-n
];
objectify = function(vals) {
if (vals.length <= 2) {
return { name: vals[0], val: vals[1] }
} else {
var name = vals.shift()
return { "name": name,
"sub-name": [objectify(vals)] }
}
}
result = testData.map(objectify)
console.log(JSON.stringify(result))(参见jsfiddle:https://jsfiddle.net/74o5gkmc/)
发布于 2015-12-17 19:33:32
你只需要做两个修复:
修正1:在代码中,假设testObj是子类别列表的内部对象。但是,您传递的是整个列表,而不是对象本身。考虑递归函数参数的类型和用途将有助于您避免这个错误。
recursive(element, i, testObj.subCategory[0]);修正2:要摆脱对象属性,需要将undefined分配给它,而不是null。
testObj.subCategory[0].subCategory = undefined;https://stackoverflow.com/questions/34342598
复制相似问题