我想编写一个递归函数来解析嵌套的JSON。
以下是我的JSON外观:
var data = {
a: {
x: ["a", "b", "c", "d"],
},
b: {
y: ["ab"],
z: ["abc"],
},
c: ["a1", "b1"]
};
这是我写的:
var recurse = function(key, val) {
window.mappedKey = window.mappedKey || '';
if ($.type(val) === 'array') {
if ($.inArray(search, val) >= 0) {
window.mappedKey += key;
alert(window.mappedKey);
} else {
window.mappedKey = '';
}
} else {
window.mappedKey += key + '.';
$.each(val, recurse);
}
};
var search = 'ab';
$.each(data, recurse);
这里我使用全局window.mappedKey
来存储递归的上一个键。它运行正常,但有任何方法可以通过在递归函数中使用局部变量来防止这种情况。
答案 0 :(得分:1)
我不太明白mappedKey
的目的,所以请耐心等待。
通常,当您想要将信息从一个函数实例传递给它调用的递归实例时,可以通过将信息作为参数传递给函数来实现。然后,该函数生成本地副本,根据需要对副本进行修改,然后使用 copy 调用自身。 (通过这种方式,它可以避免更改传递给 it 的原始值/列表。)当函数实例消失时,所有局部变量都会消失,因此也会复制它。
答案 1 :(得分:0)
有两种方法可以解决这个问题。
正如@MikeRobinson所说,你可以将值传递到recurse并存储为interally:
for (var i in data) {
if (data.hasOwnProperty(i)) {
recurse(i, data[i], mappedKey);
}
}
将mappedKey
值绑定到函数调用
$.each(data, recurse.bind(null, mappedKey);
在数字2中,mappedKey将预先到参数。
最终的函数看起来像(如下): 1。
var recurse = function(key, val, mappedKey) {
if ($.type(val) === 'array'){
if($.inArray(search, val) >= 0){
mappedKey += key;
}
else {
mappedKey = '';
}
} else {
mappedKey += key + '.';
for (var i in val) {
if (val.hasOwnProperty(i)) {
recurse(i, val[i], mappedKey);
}
}
}
};
var search = 'ab';
for (var i in data) {
if (data.hasOwnProperty(i)) {
recurse(i, data[i], '');
}
}
2。
var recurse = function(mappedKey, key, val) {
if ($.type(val) === 'array'){
if($.inArray(search, val) >= 0){
mappedKey += key;
}
else {
mappedKey = '';
}
} else {
mappedKey += key + '.';
$.each(val, recurse.bind(null, mappedKey));
}
};
var search = 'ab';
$.each(data, recurse.bind(null, ''));