JS过滤筛选树形JSON数据,filter递归实现路由菜单的筛选

26 篇文章 1 订阅

一.前言

在实际开发中,对树形JSON数据处理的业务场景非常常见;而且这些数据必然是多层级的,那么很重要的一点就是要做到递归。特别是在动态路由筛选和树形结构数据筛选中。正所谓,“工欲善其事,必先利其器”。所以本文总结几种用于处理得到我们业务中所需的真正数据的方法。

二.实现方法

  1. splice”方法 (不推荐)
  • 说明:这种方法只适应于唯一性的条件(比如:过滤唯一性id)的场景。
    如果是用在筛选树形数据或者路由菜单(比如:过滤hidden为true)的场景,会因为其实正向删除index值,故导致第一次除外的每次遍历递归的index值不准确,所以删除的值也是不对的,故不推荐

  • 代码实现:

//只适用于唯一性的id的递归过滤
function filterData(arr, id) {
  arr.forEach((item, index) => {
    if (item.id === id) {
      arr.splice(index, 1)
    }
    if (item.children && item.children.length) {
      filterData(item.children, id)
    }
  })
}
  1. 纯“filter”方法 (推荐)
  • 代码实现:
// 递归过滤得到每一项的hidden为false的数据
function filterData2(arr) {
  return arr.filter(item => {
    if (item.children) {
      item.children = filterData2(item.children)
    }
    if (!item.hidden) {
      return true
    }
  })
}
  1. filter”加“map”方法 (推荐)
  • 代码实现:
//深拷贝
function deepCopy(params) {
  // 如果不是对象则退出(可停止递归)
  if (typeof params !== 'object') return;
  // 深拷贝初始值:对象/数组
  let newObj = (params instanceof Array) ? [] : {};
  // 使用 for-in 循环对象属性(包括原型链上的属性)
  for (let i in params) {
    // 只访问对象自身属性
    if (params.hasOwnProperty(i)) {
      // 当前属性还未存在于新对象中时
      if (!(i in newObj)) {
        if (params[i] instanceof Date) {
          // 判断日期类型
          newObj[i] = new Date(params[i].getTime());
        } else if (params[i] instanceof RegExp) {
          // 判断正则类型
          newObj[i] = new RegExp(params[i]);
        } else if ((typeof params[i] === 'object') && params[i].nodeType === 1) {
          // 判断 DOM 元素节点
          let domEle = document.getElementsByTagName(params[i].nodeName)[0];
          newObj[i] = domEle.cloneNode(true);
        } else {
          // 当元素属于对象(排除 Date、RegExp、DOM)类型时递归拷贝
          newObj[i] = (typeof params[i] === 'object') ? deepCopy(params[i]) : params[i];
        }
      }
    }
  }
  return newObj;
}


// 递归过滤得到每一项的hidden为false的数据
function filterData3(arr){
  return arr.filter(item => {
      return !item.hidden
  }).map(i => {
      i = deepCopy(i)
      if (i.children) {
          i.children = filterData3(i.children)
      }
      return i
  })
}

三.文末

感兴趣的童靴可以根据自己项目自行测试和使用。当然,实现的方法还有很多,重要的是掌握其中递归遍历的思想。如大佬们有更有优秀的实现方法,还请多多指教。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个 Java 递归反序列化树形 JSON 数据的示例代码: ```java import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonTreeDeserializer { private static ObjectMapper mapper = new ObjectMapper(); public static void main(String[] args) { String json = "{\"id\":1,\"name\":\"root\",\"children\":[{\"id\":2,\"name\":\"child1\",\"children\":[{\"id\":3,\"name\":\"grandchild1\"},{\"id\":4,\"name\":\"grandchild2\"}]},{\"id\":5,\"name\":\"child2\",\"children\":[{\"id\":6,\"name\":\"grandchild3\"},{\"id\":7,\"name\":\"grandchild4\"}]}]}"; try { JsonNode rootNode = mapper.readTree(json); Node tree = deserialize(rootNode); System.out.println(tree); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static Node deserialize(JsonNode node) { int id = node.get("id").asInt(); String name = node.get("name").asText(); Node tree = new Node(id, name); JsonNode childrenNode = node.get("children"); if (childrenNode != null && childrenNode.isArray()) { for (JsonNode childNode : childrenNode) { Node child = deserialize(childNode); tree.addChild(child); } } return tree; } } class Node { private int id; private String name; private List<Node> children; public Node(int id, String name) { this.id = id; this.name = name; this.children = new ArrayList<Node>(); } public void addChild(Node node) { this.children.add(node); } @Override public String toString() { return "Node [id=" + id + ", name=" + name + ", children=" + children + "]"; } } ``` 这个示例代码使用了 Jackson 库来进行 JSON 反序列化。首先读取 JSON 数据,然后递归地反序列化每个节点,并构建树形结构。最后输出树形结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值