树状结构的数组的属结构性转换

875 阅读1分钟

树状结构的数组的属结构性转换

有时候,当我们在写树状结构的时候, 发现后端返回的数据属性和我们使用的组件需要的数据格式不一致,需要我们人为的转换一下,我们就需要写一个处理函数了。

例如:

后端返回的数据结构是这样的:

const list = [
      {
        name:'aaa',
        children: [
          {name: 'aa1', children: [{
            name: 'aa11'
          }]}
        ]
      },
      {
        name:'bbb',
        children: [
          {name: 'bb1', children: [{
            name: 'bb11'
          }]}
        ]
      }
    ]

如我们使用 Ant Design 里面的树状联级筛选器

image.png

需要的数据结构是这样:

const options: Option[] = [
      {
        value: 'zhejiang',
        label: 'Zhejiang',
        children: [
          {
            value: 'hangzhou',
            label: 'Hangzhou',
            children: [
              {
                value: 'xihu',
                label: 'West Lake',
              },
            ],
          },
        ],
      },
    ]

那我们怎么把后端返回的数据格式转成我们需要的格式呢?

我们可以自己手动写一个转换格式的处理函数

const  changeTree =  (list:any) =>{
    // 定义一个开关:如果list的children 是一个数组,并且children 的 length 大于0,说明他有子级,并且子级里有数据
    const haveChildren = Array.isArray(list.children) && list.children.length > 0;
      return {
          value: list.name,
          label: list.name,
          // 如果子级开关是 true,就循环调用函数本身,否则 返回 null
          children: haveChildren ? list.children.map((i:any) => changeTree(i)) : null
      };
    }

然后再在合适的位置,调用该函数:

const newList = (list||[]).map((item)=>{
    if(item.children) {
      return changeTree(item)
    }
    else {
      return {label: item.name,value:item.name}
    }
    console.log(newList);    
 })

接下来看看打印一下我们的newList吧。

image.png

就实现啦。