我正在执行一个代码,其中我必须遍历嵌套的对象并在单个字符串中返回所有值。例如,如果这是输入:
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
为什么我会得到带有值的“未定义”,我该如何解决?
答案 0 :(得分:4)
您可以像这样使用flatMap
和Object.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);