将带有嵌套数组(树)的JSON数组转换为平面JSON数组



我有这个JSON数组树,它可以包括任何数量的嵌套数组:

const namesArrayTree = [
{
"name": "Peter"
},
{
"name": "folder1",
"isArray": true,
"namesArray": [
{
"name": "Paul"
},
{
"name": "folder2",
"isArray": true,
"namesArray": [
{
"name": "Mary"
},
{
"name": "John"
}
]
}
]
},
{
"name": "Mark"
}
]

我需要将其转换为仅包含名称的平面数组:

const namesArrayFlat = [ "Peter", "Paul", "Mary", "John", "Mark" ]

所以我用这个代码来做转换:

const namesArrayTree = [
{
"name": "Peter"
},
{
"name": "folder1",
"isArray": true,
"namesArray": [
{
"name": "Paul"
},
{
"name": "folder2",
"isArray": true,
"namesArray": [
{
"name": "Mary"
},
{
"name": "John"
}
]
}
]
},
{
"name": "Mark"
}
] ;
function getNamesList(item) {
let name = item.name;
let isArray = item.isArray;
if (isArray) {
name = item.namesArray.map(getNamesList).join("rn");
}
return name;
}
const namesList = namesArrayTree.map(getNamesList).join("rn");
const namesArrayFlat = namesList.split("rn");

console.log(namesArrayFlat)

代码运行得很好,但我想省去额外的步骤,即使用join.("rn")创建一个包含名称的列表,然后使用split("rn")转换为数组。

也就是说,我想通过删除以下内容来减少代码:

function getNamesList(item) {
let name = item.name;
let isArray = item.isArray;
if (isArray) {
/* remove code to join by "rn" */
name = item.namesArray.map(getNamesList) 
}
return name;
}
/* remove code to create "namesList" constant and remove code to join by "rn") */
const namesArrayFlat = namesArrayTree.map(getNamesList) 

console.log(namesArrayFlat)

(以上代码仍然返回树嵌套数组结构)

关于如何去掉多余的代码,有什么想法吗?关于如何改进代码的任何建议都将非常好,谢谢!

function getNamesList(item) {
return item.isArray ? item.namesArray.map(getNamesList) : item.name
}
const names = namesArrayTree.map(getNamesList).flat(Infinity)
console.log(names)

您可以通过以下阵列缩减器来实现这一点:

const namesArray = [
{
"name": "Peter"
},
{
"name": "folder1",
"isArray": true,
"namesArray": [
{
"name": "Paul"
},
{
"name": "folder2",
"isArray": true,
"namesArray": [
{
"name": "Mary"
},
{
"name": "John"
}
]
}
]
},
{
"name": "Mark"
}
] ;
function reduceNamesList(list, item) {
if (item.isArray) {
return item.namesArray.reduce(reduceNamesList, list);
}
list.push(item.name)
return list
}
const namesList = namesArray.reduce(reduceNamesList, [])
console.log(namesList)

最新更新