Javascript嵌套对象遍历

时间:2019-07-20 11:56:55

标签: javascript object

我正在执行一个代码,其中我必须遍历嵌套的对象并在单个字符串中返回所有值。例如,如果这是输入:

var obj = {
name: "root",
contents: [
  {
    name: "A",
    contents: [
      {
        name: "fileA1",
        contents: ["Hello!"]
      }
    ]
  },
  {
    name: "B",
    contents: [
      {
        name: "dirB1",
        contents: [
          {
            name: "fileB1.1",
            contents: ["Hello!"]
          }
        ]
      }
    ]
  }
]
};

输出应为:

root
A
fileA1
Hello!
B
dirB1
fileB1.1
Hello!

我的代码是:

function toArray(obj) {
var result = '';
for (const prop in obj) {
    const value = obj[prop];
    if (typeof value === 'object') {
        result+=(toArray(value)); 
    }
    else {
        result+=(value);
    }
}
//console.log(result);
return result;
}

但是当我运行它时,它返回以下字符串:

Hello!
fileA1undefined
undefined
Aundefined
Hello!
fileB1.1undefined
undefined
dirB1undefined
undefined
Bundefined
undefinedundefined
rootundefined

为什么我会得到带有值的“未定义”,我该如何解决?

2 个答案:

答案 0 :(得分:4)

您可以像这样使用flatMapObject.values()

var obj = {name:"root",contents:[{name:"A",contents:[{name:"fileA1",contents:["Hello!"]}]},{name:"B",contents:[{name:"dirB1",contents:[{name:"fileB1.1",contents:["Hello!"]}]}]}]}

const getValues = o =>
  Object.values(o).flatMap(v => typeof(v) === 'object' ? getValues(v) : v)

console.log(getValues(obj).join('\n'))

如果将\n添加到result += value,则代码将返回所需的结果:

function toArray(obj) {
  var result = '';
  for (const prop in obj) {
    const value = obj[prop];
    if (typeof value === 'object') {
      result += toArray(value);
    } else {
      result += value + '\n';
    }
  }
  return result;
}

var obj = {name:"root",contents:[{name:"A",contents:[{name:"fileA1",contents:["Hello!"]}]},{name:"B",contents:[{name:"dirB1",contents:[{name:"fileB1.1",contents:["Hello!"]}]}]}]}

console.log(toArray(obj))

答案 1 :(得分:0)

运行您的代码,我得到的输出

  

“ rootAfileA1Hello!BdirB1fileB1.1Hello!”

因此它不能在我的浏览器中重现,但是,您的对象还有一些其他成员,其值均为undefined。因此,让我们添加换行符并避免使用未定义的值:

var obj = {
name: "root",
contents: [
  {
    name: "A",
    contents: [
      {
        name: "fileA1",
        contents: ["Hello!"]
      }
    ]
  },
  {
    name: "B",
    contents: [
      {
        name: "dirB1",
        contents: [
          {
            name: "fileB1.1",
            contents: ["Hello!"]
          }
        ]
      }
    ]
  }
]
};
function toArray(obj) {
var result = '';
for (const prop in obj) {
    const value = obj[prop];
    if (typeof value === 'object') {
        result+=(toArray(value)); 
    }
    else if (value !== undefined) {
        result+=(value) + "\n";
    }
}
//console.log(result);
return result;
}
toArray(obj);