JS对象数组的递归排序(二十四)

简介: JS对象数组的递归排序(二十四)

一. 对象数组的递归排序


在项目开发中,老蝴蝶常常遇到这样的问题, 后端返回一个对象集合,如权限的表, 有 id,parentId,name 这样的自身关联的表, 在后端查询时,查询出来了一些数据,但是这些数据通常是错综复杂的,排序并不明显。 在Oracle 数据库中,可以通过 start with … connect by …语句来进行查询,但是在MySQL数据库中没有这样的用法。 所以,有时候,前端排序也是非常重要的。 这个方法,就是通过 子与父之间的联系,进行相应的排序, 需要id,parentId 这样的字段来进行指定,不需要级别来指定。 如果没有父的话,那么parentId=0,或者是空。


如一个权限表:

20191012140711644.png

后端返回给前端的数据格式是,


20191012140720308.png


太多,老蝴蝶这儿就简单截个屏两个了。


在表格中,用的是bootstrap-table 表格,响应的结果是:


function handleClientData(res){
  var privilegeList=res.privilegeList?res.privilegeList:[];
  return privilegeList;
}


20191012140730132.png


发现,这种展示方式很明显是不可以的。


可以通过一个方法,将响应的对象数组进行改变一下。


二. 通过递归,排序出新的集体。


方法中所用的 Map, 即new Map(), 并不是 JS的Map,而是老蝴蝶找的Map. 关于Map的内容,可以看老蝴蝶以前写的文章: JS的Map详细形式(十八)


深复制 DeepCopy() ,也可以参考老蝴蝶以前写的文章: JS的数组和对象深层拷贝(二十一)


/**
 * 
 * @param data 要排序的对象数组
 * @param idName id的编号名称
 * @param pIdName 父级的编号名称
 */
function listToTree(data,idName,pIdName){
  //最后结果的集合
  var resultData=[];
  //存储 父下面的所有的子的集合。 key为父,value为子的集合。
  var parentMap=new Map();
  //存储第一级别,即刚开始的那个集合。
   var firstLevelData=[];
  //2。 为了避免造成对原来数据的干扰,进行一个深度的Copy.
  var resultDeepList=deepCopy(data);
  $.each(resultDeepList,function(idx,item){
    var oldItem=item;
    if(!item[pIdName]){  //为空,或者值是0时,设置成-1.
      item[pIdName]=-1; 
    }
    //放置父级
    if(parentMap.containsKey(item[pIdName])){
      parentMap.get(item[pIdName]).push(oldItem);
    }else{
      var arr=new Array();
      arr.push(oldItem);
      parentMap.put(item[pIdName],arr);
    }
    //取出第一级别的那些集合。
    if(item[pIdName]==-1){
      firstLevelData.push(oldItem);
    }
  })
  diGuiTree(resultData,firstLevelData,parentMap,idName);
  return resultData;
}
function diGuiTree(resultData,data,parentMap,idName){ //放置过来的,是每一个的树。
  if(data!=null&&data.length>0){
    for(var i=0,length=data.length;i<length;i++){ 
      var single=data[i];
      resultData.push(single);
      //看是否有子级。
      if(parentMap.get(single[idName])){ //有子级
        var sonList=parentMap.get(single[idName]);
        if(sonList&&sonList.length>0){
          diGuiTree(resultData,sonList,parentMap,idName);
        }
      }
    }
  }
}


三. 响应时,调用新方法


写好了这个方法,在响应时进行调用。


function handleClientData(res){
  var privilegeList=res.privilegeList?res.privilegeList:[];
  //return privilegeList; //以前的调用形式
  var resultData=listToTree(privilegeList,"id","parentid");
  return resultData;
}


刷新表格,展示:


20191012140741348.png


四. 补充


展示有层次,是因为对 name那一列进行了设置样式。


<th data-field="name" data-align="center" data-cell-style="nameCellStyle">名称</th>


function nameCellStyle(value,row,index,field){
  var level=row.level;
  return {
    css:{
       "text-align":'left !important',
      "padding-left":(level*40)+"px"
    }
  }
}


谢谢!!!

相关文章
|
1天前
|
JavaScript 索引
Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`&lt;li&gt;`元素
【6月更文挑战第25天】Vue.js的`v-for`用于基于数组或对象渲染列表,如遍历数组生成`&lt;li&gt;`元素。基本语法是`v-for=&quot;(item, index) in items&quot;`,支持遍历对象的键值对。注意与`v-if`同用时应使用`&lt;template&gt;`,组件上使用`v-for`需设`key`属性以优化性能。
10 2
|
1天前
|
JavaScript 索引
JS判断数组是否包含某个元素
JS判断数组是否包含某个元素
6 1
|
3天前
|
JavaScript
JS数组排序看懂这篇就够了
JS数组排序看懂这篇就够了
|
4天前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
15 2
|
5天前
|
JavaScript 前端开发 测试技术
了解JS递归
了解JS递归
12 1
|
5天前
|
JavaScript 前端开发
记录Javascript数组类练习
记录Javascript数组类练习
9 1
|
1天前
|
JavaScript 索引
JS数组常用方法总结,含ES6新方法,附示例代码
JS数组常用方法总结,含ES6新方法,附示例代码
|
1天前
|
存储 JavaScript 前端开发
JavaScript——JavaScript基础:数组 | JavaScript函数:使用、作用域、函数表达式、预解析
在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。①全局变量:不在任何函数内声明的变量(显式定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用。函数表达式与函数声明的定义方式几乎相同,不同的是函数表达式的定义必须在调用前,而函数声明的方式则不限制声明与调用的顺序。③块级变量:ES 6提供的let关键字声明的变量称为块级变量,仅在“{}”中间有效,如if、for或while语句等。
16 0
|
5天前
|
JavaScript 前端开发
JS如何判断一个对象是否为数组?
JS如何判断一个对象是否为数组?
10 0
|
5天前
|
JavaScript 搜索推荐 算法
JS的三种排序方法,它们的原理
JS的三种排序方法,它们的原理
5 0