关于js递归的问题?

发布于 2022-09-13 00:48:52 字数 926 浏览 22 评论 0

在处理树形数组时,只会写那种不是带返回值的递归

function setChildrenLevel(data, level, bgStyle){
    data.senLevName = level
    data.bgStyle = bgStyle
    if(data.children && data.children.length){
        data.children.forEach(item=>{
            setChildrenLevel(item, level, bgStyle)
        })
    }
}
var data = {
    name: 1,
    children:[
        {
            name: 2,
            children: [
                {
                    name: 3
                }
            ]
        },
        {
            name: 4,
        }
    ]
}
function setChildrenLevel(data, level, bgStyle){
    data.senLevName = level
    data.bgStyle = bgStyle
    if(data.children && data.children.length){
        data.children.forEach(item=>{
            setChildrenLevel(item, level, bgStyle)
        })
    }
}
setChildrenLevel(data, 4, 'red')
console.log(data)

如何写那种是return的递归去处理树形数组,有什么模板吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

掐死时间 2022-09-20 00:48:52

你这种递归修改数据的是不需要返回值的,如果你要复制一份,直接深度克隆 data 就可以了。
带返回值的比如这种——

    _getPlaceWrap({ children }) {
        let res = null;
        for(const child of children) {
            if(child.isMateList) {
                res = child;
                break;
            }
            res = _getPlaceWrap(child)
        }
        return res
    }

它的功能是找到对象树中的有 isMateList 标记的第一个元素,找到之后会层层返回。
当然,我这个 isMateList 只有一个,所以直接深度遍历找到它就可以了,如果是有多个目标的话,是不能 break 的,对应的 res 也应该换成数组或者对象以便存储所有返回值:

    _getPlaceWrap({ children }, res = []) {
        for(const child of children) {
            if(child.isMateList) {
                res.push(child);
            }
            _getPlaceWrap(child, res);
        }
        return res
    }
烧了回忆取暖 2022-09-20 00:48:52
var data = {
    name: 1,
    children:[
        {
            name: 2,
            children: [
                {
                    name: 3
                }
            ]
        },
        {
            name: 4,
        }
    ]
};

function setChildrenLevel(data, level, bgStyle){
   return data.map((item)=>{
       item.senLevName=level;
      item.bgStyle=bgStyle;
      setChildrenLevel(item.children||[], level, bgStyle);
      return item;
 })
}

setChildrenLevel([data], 4, 'red');

结果

{
  "name": 1,
  "children": [
    {
      "name": 2,
      "children": [
        {
          "name": 3,
          "senLevName": 4,
          "bgStyle": "red"
        }
      ],
      "senLevName": 4,
      "bgStyle": "red"
    },
    {
      "name": 4,
      "senLevName": 4,
      "bgStyle": "red"
    }
  ],
  "senLevName": 4,
  "bgStyle": "red"
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文