改进node.js代码以循环遍历json嵌套对象

时间:2017-07-24 21:11:19

标签: javascript json node.js lambda

我有以下代码正在运行,但它似乎超重的目的。是否有更短的方法来实现循环嵌套json的目标?

我在lambda上运行它并从s3

加载json

myFile.json

 {
  "jsonIsOk": 
    [
     {
       "txt_in": "aaa",
       "txt_out": "111"
     },
     {
       "txt_in": "bbb",
       "txt_out": "222"
     },
     {
      "txt_in": "ccc",
       "txt_out": "333"
     }
    ]
   }

lambda node.js

var isJsnOk = "jsonIsOk";

var s3 = new AWS.S3({httpOptions: { timeout: 2000 }});
var params = {
    Bucket: 'myBucket',
    Key: 'myFile.json',
};

s3.getObject(params, function (err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        var loadJson = data.Body.toString();
        var jsnAry = JSON.parse(loadJson);
        if (jsnAry.hasOwnProperty(isJsnOk)) {
            for (var key_01 in jsnAry) {
              if (jsnAry.hasOwnProperty(key_01)) {
                    for (var key_02 in jsnAry[key_01]) {
                        console.log('key_02=' + key_02);
                        if (jsnAry[key_01].hasOwnProperty(key_02)) {
                            for (var key_03 in jsnAry[key_01][key_02]) {
                                console.log('key_03=' + key_03 + ': val_03 =' + jsnAry[key_01][key_02][key_03]);
                            }
                        }
                        console.log("-------");
                    }
                }
            }
        } else {
            console.log("error: json is not ok!");
        }
    }
}

输出

key_02=0
key_03=txt_in: val_03 =aaa
key_03=txt_out: val_03 =111
-------
key_02=1
key_03=txt_in: val_03 =bbb
key_03=txt_out: val_03 =222
-------
key_02=2
key_03=txt_in: val_03 =ccc
key_03=txt_out: val_03 =333
-------

2 个答案:

答案 0 :(得分:0)

阵列上有一些原型可用于以功能方式编写嵌套循环并减少总代码行(也更容易读取imo)。这不会在你的例子中逐字地产生输出,因为我不确定键值的含义是什么(没有键,它是一个数组,它有索引)但希望它能给你一些想法如何更好地编写迭代它的代码

 {
  "jsonIsOk": 
    [
     {
       "txt_in": "aaa",
       "txt_out": "111"
     },
     {
       "txt_in": "bbb",
       "txt_out": "222"
     },
     {
      "txt_in": "ccc",
       "txt_out": "333"
     }
    ]
   }

obj.jsonIsOk.forEach(a => console.log("txt_in: " + a.txt_in + " txt_out: " + a.txt_out));

// prints
txt_in: aaa txt_out: 111
txt_in: bbb txt_out: 222
txt_in: ccc txt_out: 333

您可能还会发现map原型很有用,它的工作方式与此类似,只是它返回一个新的集合,其中包含从传递给它的函数返回的结果(我在这里使用lambda语法,你可以只需使用vanilla js传递一个匿名函数。)

答案 1 :(得分:0)

你基本上使用相同的代码循环三次,这可以很容易地递归:

[PKPaymentButton buttonWithType:...

然后这样开始:

function iterate(obj,i=1){
  Object.keys(obj).forEach(function(key){
   console.log(" ".repeat(i-1)+"key_0"+i+"="+key);
   if(typeof obj[key] === "object"){
      iterate(obj[key],i+1);
   }else{
      console.log(" ".repeat(i-1)+"value0"+i+"="+obj[key]);
   }
 });
}

http://jsbin.com/zedoluwega/edit?console

我还添加了一些空格以使结构更清晰......