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))
我尝试了这个解决方案,效果很好。