我试图在JavaScript中使用递归来深入浏览对象并返回其键和值。
这方面的一个例子是:
var json2 = {
'key1': {
'key2Nested': {
'key3Nested': {
'key4Nested': 'SomeValue'
},
'key5Nested': 'unimportantValue',
'key6Nested': 'SimpleValue'
},
'key7Nested': '2SimpleValue',
'key8Nested': 'unimportantValue2'
}
};
该函数将采用上述输入并返回类似
的内容['key1/key2Nested/key3Nested/key4Nested', 'SomeValue'],
['key1/key2Nested/key5Nested', 'unimportantValue'],
等所有值。 问题是我尝试在所有对象的键上使用for循环,我尝试在循环内使用递归。但是递归值返回一个数组,结束for循环。
这是我到目前为止的代码:
var makeArray = function(obj) {
var keysArray = Object.keys(obj);
var returnArray = [];
for (var i = 0; i < keysArray.length; i++) {
var key = keysArray[i];
var next_results;
var path, value;
if (typeof(value) != 'object' ) {
value = obj[key];
returnArray = orderedArray.concat([key, value]);
} else if (typeof(value) == "object") {
next_results = makeArray(obj[key]);
if (next_results) {
for (var j = 0; j < next_results.length; j++) {
next_results[j][1] = '/' + key + next_results[j][1];
returnArray = returnArray.concat(next_results[j]);
}
}
}
console.log(returnArray);
return returnArray;
}
}
该函数需要保存从更深递归级别返回的密钥,以便它可以将其连接到路径。
也许我的算法可以某种方式得到改进,或者我认为它错了。谁能提出一些建议?谢谢!
答案 0 :(得分:0)
请勿在for循环体内return returnArray
,但只能在它之后。
另外,还有其他一些错误:
该行
next_results[j][1] = '/' + key + next_results[j][1];
似乎不对。你的密钥位于每个元组的第一个插槽中,你希望密钥之间的斜杠不在它们之前:
next_results[j][0] = key + '/' + next_results[j][0];
在
var path, value; if (typeof(value) != 'object' ) { value = obj[key];
您在分配之前测试value
的类型(这样您基本上可以使用上一次迭代中的值)。在条件之前移动属性访问权限!
方法调用
returnArray = returnArray.concat(…)
不符合您的想法。您传入了一个要附加到数组的元组(数组),但concat
method合并了两个数组:[key1, value1].concat([key2, value]) == [key1, value1, key2, value2]
。您希望使用push
来获取元组数组。
整体而言:
function makeArray(obj) {
var keys = Object.keys(obj);
var returnArray = [];
for (var i = 0; i < keys.length; i++) {
var key = keys[i],
value = obj[key];
if (typeof value != 'object' ) {
returnArray.push([key, value]);
} else {
var next_results = makeArray(value);
for (var j = 0; j < next_results.length; j++) {
next_results[j][0] = key + '/' + next_results[j][0];
returnArray.push(next_results[j]);
}
}
}
return returnArray;
}