我对nodeJS / Javascript的异步性质(Python背景)相对较新,并试图计算如何逐步浏览嵌套的JSON对象,使用asnyc.js提取它的值。
我遇到了这个代码段How to navigate in nested JSON。
function recursiveGetProperty(obj, lookup, callback) {
for (property in obj) {
if (property == lookup) {
callback(obj[property]);
} else if (obj[property] instanceof Object) {
recursiveGetProperty(obj[property], lookup, callback);
}
}
}
对于这个示例对象,foo。
非常有用var foo = {
'key_1' : 'val1',
'key_2': {
'key_3': 'val3',
'key_4': 'val4'
}
}
recursiveGetProperty(foo, 'key_1', function(obj) {
console.log(obj);
});
返回'val1'
recursiveGetProperty(foo, 'key_3', function(obj) {
console.log(obj);
});
返回'val3'
这正是我所需要的,但是当我通过迭代提供关键值时:
var keys = ['val1', 'val3'];
for (var keys in keys) {
recursiveGetProperty(foo, keys, function(obj) {
console.log(obj);
});
}
没有任何内容记录到控制台。所以我写了一个日志功能:
function log(obj) {
console.log(obj);
}
并尝试:
for (var key in keys) {
recursiveGetProperty(foo, keys, log(obj));
}
但是我得到了ReferenceError:没有定义obj。
我被告知在for循环中执行回调并不是一个好主意,我不确定为什么所以我查看了async.js。这似乎是我想要的正确解决方案,但我不知道如何去做。
使用async.js,我想构建一系列recursiveGetProperty函数,将它们存储在一个数组中,然后异步执行这些调用,但我对如何解决问题感到困惑。
我最终想要的是这样的事情:
async.each(['key_1', 'key_2', 'key_3'], recursiveGet(key) {
doSomethingWithData();
}, function(err) {
doSomethingWhenDone();
});
这将在ExpressJS服务器上用于解析JSON,然后用它做一些事情。
非常感谢任何帮助或建议。
答案 0 :(得分:1)
此代码中存在错误
var keys = ['val1', 'val3'];
for (var keys in keys) {
recursiveGetProperty(foo, keys, function(obj) {
console.log(obj);
});
}
所以代码应该是
var keys = ['key_1', 'key_2'];
for (var key in keys) {
recursiveGetProperty(foo, keys[key], function(obj) {
console.log(obj);
});
}
答案 1 :(得分:1)
var keys = ['key_1', 'key_2'];
keys.forEach(function (key) {
recursiveGetProperty(foo, key, function(obj) {
console.log(obj);
});
});
代码中的问题:
for(var key in obj)
仅适用于对象属性,不适用于数组值。请改用Array.forEach
或常规for循环。recursiveGetProperty(foo, keys, log(obj))
:这会立即调用日志并将其返回值传递给recursiveGetProperty。您可以只传递log
或function (obj) { log(obj); }
,在这种情况下意味着相同。同样在这种情况下,您要传递的是key
。