如何使用asnyc.js迭代嵌套的JSON值
How to iterate through nested JSON values using asnyc.js
我对nodeJS/Javascript的异步特性(Python背景(相对陌生,我正在尝试如何遍历嵌套的JSON对象,使用asnyc.js.提取它的值
我看到了这个片段,如何在嵌套的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,然后对其进行处理。
如有任何帮助或建议,我们将不胜感激。
此代码中存在错误
var keys = ['val1', 'val3'];
for (var keys in keys) {
recursiveGetProperty(foo, keys, function(obj) {
console.log(obj);
});
}
- 关键字数组(第1行(被for循环的关键字索引(第2行(覆盖。所以让我们重命名这个键
- 对于迭代数组,键应该是一个数字(0,1,…,n(,而不是字符串。您需要将这些数字用作键的索引
- 此外,您的recursiveGetProperty是通过键而非值查找的
所以代码应该是
var keys = ['key_1', 'key_2'];
for (var key in keys) {
recursiveGetProperty(foo, keys[key], function(obj) {
console.log(obj);
});
}
var keys = ['key_1', 'key_2'];
keys.forEach(function (key) {
recursiveGetProperty(foo, key, function(obj) {
console.log(obj);
});
});
http://jsfiddle.net/fPRQK/
代码中的问题:
for(var key in obj)
仅适用于对象属性,不适用于数组值。请改用Array.forEach
或正则for循环recursiveGetProperty(foo, keys, log(obj))
:这将立即调用日志,并将其返回值传递给recursiveGetProperty。您可以只传递log
或function (obj) { log(obj); }
,在本例中它们的含义相同。在这种情况下,您想要传递的也是key
相关文章:
- Javascript-JSON-嵌套和分组
- JSON 嵌套 Ul 来自 Javascript 中的单维或多维 json 对象
- 如何从 json 嵌套结构中获取键的 json 值
- 如何使用角度获取这些 json 嵌套值
- 使用jquery加载json嵌套对象
- 如何在JavaScript中从url解析json(嵌套)
- 如何在 Python 和 JavaScript 中以相同的方式散列“json”嵌套字典
- 对象和数组的复杂 JSON 嵌套
- JSON嵌套对象分析
- Evaluate Json-嵌套的Json路径以字符串形式提供
- JSON嵌套“;第n级”;对象数组转换为多维数组
- jQuery JSON嵌套循环
- 查找使用多个字符串值的JSON嵌套节点
- 浏览json嵌套文件
- Angularjs的ng-repeat下拉菜单从json嵌套
- JSON嵌套对象vs Javascript数组
- 重复使用不同的json嵌套
- 我如何使用d3.js导航JSON嵌套文件
- Grails 2.4.4绑定JSON嵌套对象
- JSON 嵌套解析帮助使用 $.each