如何迭代深层嵌套对象并查找特定键的值?

我有一个 Javascript 对象,如下所示。我想遍历对象并找出值Hostnames


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"

      }

    ]

  }

}

我写了以下 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


四季花海
浏览 141回答 2
2回答

函数式编程

因此,让我们删除无用的上下文。您想要深入查找对象中的“主机名”值。并且您的递归似乎循环,导致超出最大调用堆栈大小错误。怎么才能自己发现问题呢?只需添加 `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);

红颜莎娜

数据结构需要嵌套循环,但这是可行的。这将提供一个主机名数组:“我想遍历对象并找出主机名的值”。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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript