如何使用async.js迭代嵌套的JSON值

时间:2014-03-20 19:22:28

标签: javascript node.js express async.js

我对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,然后用它做一些事情。

非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

此代码中存在错误

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);
    });
}

答案 1 :(得分:1)

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。您可以只传递logfunction (obj) { log(obj); },在这种情况下意味着相同。同样在这种情况下,您要传递的是key