Javascript NodeJS-将递归中的嵌套数组展平为字符串数组

Javascript NodeJS-将递归中的嵌套数组展平为字符串数组,javascript,node.js,arrays,recursion,Javascript,Node.js,Arrays,Recursion,我有这样的数据结构: { "fieldNodes": [ { "selectionSet": { "selections": [ { "name": { "value": "id" } }, {

我有这样的数据结构:

{
  "fieldNodes": [
    {
      "selectionSet": {
        "selections": [
          {
            "name": {
              "value": "id"
            }
          },
          {
            "name": {
              "value": "phone"
            }
          },
          {
            "name": {
              "value": "address"
            },
            "selectionSet": {
              "selections": [
                {
                  "name": {
                    "value": "street"
                  }
                },
                {
                  "name": {
                    "value": "city"
                  }
                }
              ]
            }
          }
        ]
      }
    }
  ]
}
我需要在递归中遍历
字段节点
数组,并创建一个值字符串数组(
name.value

嵌套值将由点(
“address.city”
)表示

此示例的结果将是:
[“id”、“phone”、“address.street”、“address.city”]

我假设
fieldNodes
数组中有一个对象


有人能帮我看看NodeJS中的代码应该是什么样子吗?

试试我做的这个递归函数:

var obj={
“字段节点”:[{
“选择集”:{
“选择”:[{
“姓名”:{
“值”:“id”
}
},
{
“姓名”:{
“值”:“电话”
}
},
{
“姓名”:{
“值”:“地址”
},
“选择集”:{
“选择”:[{
“姓名”:{
“价值”:“街道”
}
},
{
“姓名”:{
“价值”:“城市”
}
}
]
}
}
]
}
}]
};
函数展平(obj){
如果(!对象选择集){
if(obj.name)返回[obj.name.value];
返回[];
}
var list=obj.selectionSet.selections.map(展平).flat();
if(!obj.name)返回列表;
返回list.map(item=>obj.name.value+“+item);
}
var list=obj.fieldNodes.map(展平).flat();

控制台日志(列表)您可以使用递归生成器函数:

var data={'fieldNodes':[{'selectionSet':{'selections':[{'name':{'value':'id'}},{'name':{'value':'phone'},{'name':{'value':'address'},'selectionSet':{'selections':[{'name':{'value':'street'},{'name':{'value':'city'}}}}}
函数*flatten(d,c=[]){
用于(变量i/d){
如果(i中的“选择集”){
收益率*展平(i.selectionSet.selections,'name'在i?[…c,i.name.value]:c)
}
否则{
收益率[…c,i.name.value]
}
}
}
var result=Array.from(展平(data.fieldNodes)).map(x=>x.join('.');

console.log(result)
一旦您下降到
selectionSort
级别,它就是一个相当简单的递归。在这里,我们将递归调用封装为(
flat
映射到
fieldNodes
对象上的调用。因为您只需要一个,所以在这里无论是
map
还是
flatMap
,结果都很简单。但是如果您可能有多个,并且希望对它们进行分组,则可以将
fieldNodes.flatMap(…)
替换为
fieldNodes.map(…)

constprocessselectionset=({selectionSet:{selections=[]}})=>
平面地图(
({name:{value},selectionSet})=>selectionSet
?processSelectionSet({selectionSet}).map(名称=>`${value}.${name}`)
:价值
)
常量提取=({fieldNodes=[]})=>
fieldNodes.flatMap(processSelectionSet)
const input={fieldNodes:[{selectionSet:{selections:[{name:{value:{id}},{name:{value:{phone},},{name:{value:{address},selectionSet:{selections:[{name:{value:{street:{id}},},{name:{value:{city:{city}}}}}}

log(extract(input))
我尝试了这个解决方案,效果很好。