[英]refine node.js code to loop through json nested objects
我有下面的代碼正在工作,但似乎超重了。 有沒有一種較短的方法可以實現通過嵌套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
-------
數組上有一些原型,您可以使用它們以功能方式編寫該嵌套循環並減少總代碼行數(也更易於閱讀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傳遞一個匿名功能)。
您基本上使用相同的代碼循環了三次,可以很容易地遞歸地使它:
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
Ive還添加了一些空格以使結構更清晰...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.