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

How to iterate through nested JSON values using asnyc.js

本文关键字:JSON 嵌套 迭代 何使用 asnyc js      更新时间:2023-09-26

我对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。您可以只传递logfunction (obj) { log(obj); },在本例中它们的含义相同。在这种情况下,您想要传递的也是key