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



我有一个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==="主机名"。。。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);

最新更新