簡體   English   中英

循環復雜的JSON對象 - 需要邏輯來獲取值的總和

[英]Looping over complex JSON objects - Need Logic to get sum of values

我在Angular應用程序中從JENKINS API消耗JSON以下。 我試圖從下面的JSON中獲取關鍵n的值的總和。 我需要一個邏輯來在打字稿中實現。

問題出在這里,JSON結構不斷變化。 如何編寫邏輯來計算鍵“ n ”的值的總和

以下是JSON結構的示例:

{
   "J": [
          {
             "n" : 3,
             "J" : [
                    {
                      "n": 6
                      "J": [
                             {
                             "n": 9
                              }
                           ]
                     }
                   ]
          }
        ]
}

sum = 18(3 + 6 + 9)

例如:2

    {
   "J": [
          {

             "J" : [
                    {

                      "J": [
                             {
                                 "J": [
                                        {
                                           "J": [
                                                  {
                                                    "n": 9
                                                  }
                                                ]
                                        }
                                      ]
                              }
                           ]
                     }
                   ]
          }
        ]
}

sum = 9

不需要花哨的邏輯, Array.reduce()的簡單遞歸就足夠了:

var sumOfN = function(o) {  
  return (o['J'] || []).reduce((m,x) => { 
    return m + sumOfN(x); 
  }, (o['n'] || 0));
};

示例#1:

 var data = { "J": [ { "n" : 3, "J" : [ { "n": 6, "J": [ { "n": 9 } ] } ] } ] }; var sumOfN = function(o) { return (o['J'] || []).reduce((m,x) => { return m + sumOfN(x); }, (o['n'] || 0)); }; console.log('result = ' + sumOfN(data)); 

示例#2:

 var data = { "J": [{ "J": [{ "J": [{ "J": [{ "J": [{ "n": 9 }] }] }] }] }] }; var sumOfN = function(o) { return (o['J'] || []).reduce((m,x) => { return m + sumOfN(x); }, (o['n'] || 0)); }; console.log('result = ' + sumOfN(data)); 


更新

例#3

 var data = { "J": [{ "J": [ { "J": [{ "J": [{ "J": [{ "n": 9 }] }] }] }, { "J": [{ "n": 9 }, { "n": 9 } ] } ] }] }; var sumOfN = function(o) { return (o['J'] || []).reduce((m,x) => { return m + sumOfN(x); }, (o['n'] || 0)); }; console.log('result = ' + sumOfN(data)); 

這是一個遞歸的TypeScript解決方案:

type J = {
    n?: number,
    J?: J[]
}

function sum(j: J, acc = 0) {
    if (j.J != null) {
        for (let subJ of j.J) {
            acc = sum(subJ, acc);
        }
    }
    return acc + (j.n ? j.n : 0);
}


console.log(sum({
    "J": [
        {
            "n": 3,
            "J": [
                {
                    "n": 6,
                    "J": [
                        {
                            "n": 9
                        }
                    ]
                }
            ]
        }
    ]
})); // 18

console.log(sum({
    "J": [
        {

            "J": [
                {

                    "J": [
                        {
                            "J": [
                                {
                                    "J": [
                                        {
                                            "n": 9
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
})); // 9 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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