【问题标题】:How to iterate through nested JSON values using asnyc.js如何使用 asnyc.js 遍历嵌套的 JSON 值
【发布时间】:2014-03-21 03:46:31
【问题描述】:

我对 nodeJS/Javascript 的异步特性(Python 背景)比较陌生,并试图弄清楚如何逐步遍历嵌套的 JSON 对象,使用 asnyc.js 提取它的值。

我遇到了这个sn-p,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 is not defined。

有人告诉我,在 for 循环中执行回调不是一个好主意,我不确定为什么,所以我研究了 async.js。这似乎是我想要的正确解决方案,但我不知道如何去做。

使用 async.js,我想构建一系列 recursiveGetProperty 函数,将它们存储在一个数组中,然后异步执行这些调用,但我不知道如何解决这个问题。

我最终想要的是这样的:

async.each(['key_1', 'key_2', 'key_3'], recursiveGet(key) {
  doSomethingWithData();
}, function(err) {
  doSomethingWhenDone();
});

这将在 ExpressJS 服务器上用于解析 JSON 并在之后对其进行处理。

任何帮助或建议将不胜感激。

【问题讨论】:

  • recursiveGetProperty(foo, keys, log(obj)); 应该是 recursiveGetProperty(foo, keys, log); 什么是 foo?为什么要在简单数组上使用递归 get 属性方法?它不是为此而设计的。
  • foo 只是我想要解析的嵌套 JSON 示例。我想为 recursiveGet 函数提供一个键列表。

标签: javascript node.js express async.js


【解决方案1】:

这段代码有bug

var keys = ['val1', 'val3'];
for (var keys in keys) {
    recursiveGetProperty(foo, keys, function(obj) {
        console.log(obj);
    });
}
  • 键数组(第 1 行)被 for 循环的键索引(第 2 行)覆盖。所以让我们重命名那个键。
  • 对于迭代数组,键是数字(0、1、...、n),而不是字符串。您需要将这些数字用作键的索引
  • 您的 recursiveGetProperty 也是通过键而不是值来查找的。​​li>

所以代码应该是

var keys = ['key_1', 'key_2'];
for (var key in keys) {
    recursiveGetProperty(foo, keys[key], function(obj) {
        console.log(obj);
    });
}

【讨论】:

  • 谢谢!我错误地复制了代码并且确实有 var 键但没有键 [键]。这行得通!
【解决方案2】:
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)):这将立即调用 log 并将其返回值传递给 recursiveGetProperty。您可以只传递logfunction (obj) { log(obj); },在这种情况下,它们的含义相同。同样在这种情况下,您要传递的是key

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多