我正在尝试使用JSON文件填充网页。我递归地遍历对象,将[key,value]属性写入字符串,并使用'list'属性来增加嵌套级别。我需要它是为了秩序。
这是我编写的功能:
plot(time, yCI95(1)+yMean)
plot(time, yCI95(2)+yMean)
这是一个示例对象:
function recurOBJ(my_obj){
let x, str
str = ``
for( x in my_obj ){
str += x + `: ` + my_obj[x].copy
console.log(x);
if ( my_obj[x].hasOwnProperty('list') ){
recurOBJ(my_obj[x].list)
}
}
console.log(str);
return str
}
问题是当我查看console.log(x)输出时,所有内容都以正确的顺序显示,但是当返回字符串console.log(str)时,它将首先显示嵌套值,然后然后是较高级别的项目,即item01和item02,之后。
正确=> console.log(x):
{
"item_01": {
"copy": ["Some text."]
},
"item_02": {
"copy": ["More text."],
"list": {
"listItem01": {
"copy": ["List text."],
"list": {
"item_a": { "copy": ["A: Lorem ipsum dolor sit amet."]},
"item_b": { "copy": ["B: Lorem ipsum dolor sit amet."]},
"item_c": { "copy": ["C: Lorem ipsum dolor sit amet."]},
"item_d": { "copy": ["D: Lorem ipsum dolor sit amet."]}
}
}}
}
}
不正确=> console.log(str):
item_01
item_02
listItem01
item_a
item_b
item_c
item_d
我不知道如何解决这个问题。我曾尝试将Object转换为Map以保留顺序,但是那也不起作用。
答案 0 :(得分:1)
因此,您所做的一切正确。除了您也应该返回递归值。
稍微修改一下代码,它应该可以工作。
function recurOBJ(my_obj){
let x, str
str = ``
for( x in my_obj ){
str += x + ': ' + my_obj[x].copy + '\n'
if ( my_obj[x].hasOwnProperty('list') ){
str += recurOBJ(my_obj[x].list) + '\n'
}
}
return str
}
输出:
item_01: Some text.
item_02: More text.
listItem01: List text.
item_a: A: Lorem ipsum dolor sit amet.
item_b: B: Lorem ipsum dolor sit amet.
item_c: C: Lorem ipsum dolor sit amet.
item_d: D: Lorem ipsum dolor sit amet.
答案 1 :(得分:0)
您可以采用递归方法,返回字符串数组和带有list
属性或空对象的子代。
function getData(object) {
return [].concat(
...Object
.entries(object)
.map(([k, v]) => [k + ': ' + v.copy[0], ...getData(v.list || {})])
);
}
var data = { item_01: { copy: ["Some text."] }, item_02: { copy: ["More text."], list: { listItem01: { copy: ["List text."], list: { item_a: { copy: ["A: Lorem ipsum dolor sit amet."] }, item_b: { copy: ["B: Lorem ipsum dolor sit amet."] }, item_c: { copy: ["C: Lorem ipsum dolor sit amet."] }, item_d: { copy: ["D: Lorem ipsum dolor sit amet."] } } } } } };
console.log(getData(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }