js中处理数据问题,遇到问题了,写不出来。

把以下数据处理成这样的

// 源数据
var arr = [{
                name: "河南",
                url: "*",
                child: [{
                        name: "濮阳",
                        url: "*",
                        child: [{
                                name: "南乐县",
                                url: "nale.html"
                            },
                            {
                                name: "清丰县",
                                url: "qingfeng"
                            }
                        ]
                    },
                    {
                        name: "鹤壁",
                        url: "hebi.html"
                    },
                ]
            },
            {
                name: "广东",
                url: "*",
                child: [{
                        name: "深圳",
                        url: "*",
                        child: [{
                                name: "宝安区",
                                url: "baoan"
                            },
                            {
                                name: "南山区",
                                url: "nanshan.html"
                            }
                        ]
                    },
                    {
                        name: "广州",
                        url: "guangzhou"
                    },
                    {
                        name: "佛山",
                        url: "foshna.html"
                    }
                ]
            },
        ]


要处理成这样的

var arr = [{
                name: "河南",
                url: "*",
                child: [{
                        name: "濮阳",
                        url: "*",
                        child: [{
                                name: "南乐县",
                                url: "nale.html"
                            },
                        ]
                    },
                    {
                        name: "鹤壁",
                        url: "hebi.html"
                    },
                ]
            },
            {
                name: "广东",
                url: "*",
                child: [{
                        name: "深圳",
                        url: "*",
                        child: [
                            {
                                name: "南山区",
                                url: "nanshan.html"
                            }
                        ]
                    },
                    {
                        name: "佛山",
                        url: "foshna.html"
                    }
                ]
            },
        ]

要求只要以.html结尾的,但保持数据结构不变。我可以想到用endsWith()

像这种可以直接使用递归进行遍历修改


 // 源数据
  var arr = [{
    name: "河南",
    url: "*",
    child: [{
      name: "濮阳",
      url: "*",
      child: [{
        name: "南乐县",
        url: "nale.html"
      },
      {
        name: "清丰县",
        url: "qingfeng"
      }
      ]
    },
    {
      name: "鹤壁",
      url: "hebi.html"
    },
    ]
  },
  {
    name: "广东",
    url: "*",
    child: [{
      name: "深圳",
      url: "*",
      child: [{
        name: "宝安区",
        url: "baoan"
      },
      {
        name: "南山区",
        url: "nanshan.html"
      }
      ]
    },
    {
      name: "广州",
      url: "guangzhou"
    },
    {
      name: "佛山",
      url: "foshna.html"
    }
    ]
  },
  ];
  let a=arrayTreeFilter(arr, filterFn, ".html");
  console.log(a)

  function arrayTreeFilter(data, predicate, filterText) {
    const nodes = data;
    // 如果已经没有节点了,结束递归
    if (!(nodes && nodes.length)) {
      return;
    }
    const newChildren = [];
    for (const node of nodes) {
      if (predicate(node, filterText)) {
        // 如果自己(节点)符合条件,直接加入到新的节点集
        newChildren.push(node);
        // 并接着处理其 children,(因为父节点符合,子节点一定要在,所以这一步就不递归了)
        node.child = arrayTreeFilter(node.child, predicate, filterText);
      } else {
        // 如果自己不符合条件,需要根据子集来判断它是否将其加入新节点集
        // 根据递归调用 arrayTreeFilter() 的返回值来判断
        const subs = arrayTreeFilter(node.child, predicate, filterText);
        // 以下两个条件任何一个成立,当前节点都应该加入到新子节点集中
        // 1. 子孙节点中存在符合条件的,即 subs 数组中有值
        // 2. 自己本身符合条件
        if ((subs && subs.length) || predicate(node, filterText)) {
          node.child = subs;
          newChildren.push(node);
        }
      }
    }
    return newChildren;
  }

  function filterFn(data, filterText) { //过滤函数
    if (!filterText) {
      return true;
    }
    return (
      new RegExp(filterText, "i").test(data.url) //我是一title过滤 ,你可以根据自己需求改动
    );
  }

我这个是递归循环出来的。嵌套很多层页可以处理。如果数据只是 两层 不用这么麻烦