繁体   English   中英

如何遍历深层嵌套对象并找到特定键的值?

[英]How to iterate through deep nested object and find value of a particular key?

我有一个 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

所以让我们删除无用的上下文。 您想在对象中深入查找“主机名”值。

并且您的递归似乎循环,导致最大调用堆栈大小超出错误。

怎么自己找问题? 只需添加`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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM