2017-07-24 141 views
0

我有下面的代码工作,但它似乎超重的目的。有没有更简单的方法来实现循环嵌套json的目标?精炼node.js代码循环通过json嵌套对象

我在λ运行这一点,从S3

myFile.json加载JSON

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

拉姆达的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 
------- 
+0

* key_02 *应提供哪些信息?你不能离开它吗? –

回答

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来传递一个匿名函数)。

0

你基本上循环三次相同的代码,它可以很容易地递归提出:

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

,然后开始像这样:

iterate(obj.jsonIsOk); 

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

香港专业教育学院还增加了一些空间使结构更清晰...