为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

四季花海 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条经验 获得超12个赞

数据结构需要嵌套循环,但这是可行的。这将提供一个主机名数组:“我想遍历对象并找出主机名的值”。


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 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信