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

Convert JSON array with nested arrays (tree) to flat JSON array

我有这个 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("\r\n");
    }
    return name;
  }

  const namesList = namesArrayTree.map(getNamesList).join("\r\n");
  const namesArrayFlat = namesList.split("\r\n");
  
  console.log(namesArrayFlat)

代码运行良好,但我想摆脱使用 join.("\r\n") 创建名称列表然后使用 split("\r\n").[=18= 转换为数组的额外步骤]

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

     function getNamesList(item) {
        let name = item.name;
        let isArray = item.isArray;

        if (isArray) {
/* remove code to join by "\r\n" */
          name = item.namesArray.map(getNamesList) 
        }
        return name;
      }
/* remove code to create "namesList" constant and remove code to join by "\r\n") */
      const namesArrayFlat = namesArrayTree.map(getNamesList) 
      
      console.log(namesArrayFlat)

(上面的代码还是returns树形嵌套数组结构)

关于如何摆脱额外代码的任何想法?还有任何关于如何改进代码的建议都将非常有用,谢谢!

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)