簡體   English   中英

優化node.js代碼以遍歷json嵌套對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM