亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何迭代深層嵌套對象并查找特定鍵的值?

如何迭代深層嵌套對象并查找特定鍵的值?

四季花海 2023-06-29 20:50:55
我有一個 Javascript 對象,如下所示。我想遍歷對象并找出值Hostnamesconst data ={  "error1": {    "7": [      {        "ErrorType": "Error-1A",        "Hostnames": "host123.com,hostabc.com,host33a.com..."      }    ],    "8": [      {        "ErrorType": "Error-1B",        "Hostnames": "host223.com,host2c.com,host43a.com..."      },      {        "ErrorType": "Error-1C",        "Hostnames": "host1231.com,host2abc.com,host313a.com..."      }    ]  },  "error2": {    "3": [      {        "ErrorType": "Error-2A"        "Hostnames": "host1231.com,host2abc.com,host313a.com..."      },      {        "ErrorType": "Error-2B"        "Hostnames": "host1231.com,host2abc.com,host313a.com..."      }    ],    "8": [      {        "ErrorType": "Error-2C"        "Hostnames": "host1231.com,host2abc.com,host313a.com..."      },      {        "ErrorType": "Error-2D",        "Hostnames": "host1231.com,host2abc.com,host313a.com..."      }    ]  },  "error3": {    "1": [      {        "ErrorType": "Error-3A",        "Hostnames": "host1236.com"      },      {        "ErrorType": "Error-3B",        "Hostnames": "hostc3231.com"      }    ]  }}我寫了以下 NodeJS 函數:const findObjectByLabel = function(obj, label) {    if(obj.label === label) { return obj; }    for(var i in obj) {        if(obj.hasOwnProperty(i)){            var foundLabel = findObjectByLabel(obj[i], label);            if(foundLabel) { return foundLabel; }        }    }    return null;};const hostNames = findObjectByLabel(data, 'Hostnames');console.log(hostNames);上面的函數拋出錯誤:Error: undefined : RangeError: Maximum call stack size exceeded
查看完整描述

2 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

因此,讓我們刪除無用的上下文。您想要深入查找對象中的“主機名”值。


并且您的遞歸似乎循環,導致超出最大調用堆棧大小錯誤。


怎么才能自己發現問題呢?只需添加 `console.log('ON', obj) 作為 'findObjectByLabel' 函數的第一行。


您將看到您在“E”上循環。因為在某些時候,被測試的對象是一個字符串。


第二個問題:您檢查 .label === 'Hostnames'...json 數據中沒有 'label' 鍵。


修復此問題后的另一個問題是您將停在第一個主機名上。


這是一個解決方案


function deepFind(obj, label, results=[]) {

    if( typeof obj !== 'object' && !!obj )

      return null;


    if( !!obj[label] ) {

      results.push(obj[label]);

    }


    Object.getOwnPropertyNames(obj).forEach( k => {

      deepFind(obj[k], label, results);

    });

}


const results = [];

deepFind(data, 'Hostnames', results);


查看完整回答
反對 回復 2023-06-29
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

數據結構需要嵌套循環,但這是可行的。這將提供一個主機名數組:“我想遍歷對象并找出主機名的值”。


const data = {

  "error1": {

    "7": [{

      "ErrorType": "Error-1A",

      "Hostnames": "host123.com,hostabc.com,host33a.com..."

    }],

    "8": [{

        "ErrorType": "Error-1B",

        "Hostnames": "host223.com,host2c.com,host43a.com..."

      },

      {

        "ErrorType": "Error-1C",

        "Hostnames": "host1231.com,host2abc.com,host313a.com..."

      }

    ]

  },

  "error2": {

    "3": [{

        "ErrorType": "Error-2A",

        "Hostnames": "host1231.com,host2abc.com,host313a.com..."

      },

      {

        "ErrorType": "Error-2B",

        "Hostnames": "host1231.com,host2abc.com,host313a.com..."

      }

    ],

    "8": [{

        "ErrorType": "Error-2C",

        "Hostnames": "host1231.com,host2abc.com,host313a.com..."

      },

      {

        "ErrorType": "Error-2D",

        "Hostnames": "host1231.com,host2abc.com,host313a.com..."

      }

    ]

  },

  "error3": {

    "1": [{

        "ErrorType": "Error-3A",

        "Hostnames": "host1236.com"

      },

      {

        "ErrorType": "Error-3B",

        "Hostnames": "hostc3231.com"

      }

    ]

  }

};


const out = [];

for (let key in data) {

  for (let number in data[key]) {

    data[key][number].map(d => out.push(d.Hostnames));

  }

}


console.log(out);


查看完整回答
反對 回復 2023-06-29
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號