根据对象数组中的一个或多个属性给数组排序
2023-09-11 14:15:07 时间
这篇文章主要介绍了如何按照一个或多个属性给一个对象数组排序。
需求
后台返回的数据需要按照一定的顺序展示,可以根据其中一个属性或多个属性。
解决办法
-
单属性排序
// 创建动态排序函数,根据传递的值对对象进行排序: function dynamicSort(property) { var sortOrder = 1; if(property[0] === "-") { sortOrder = -1; property = property.substr(1) } return function (a,b) { // 下面一行代码对字符串和数字均有效 // 你可以根据自己的需求定制它 var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0 return result * sortOrder } } // 待处理数据 var data = [ {name: 'tom4', mdate: '202012'}, {name:'tom2', mdate:'202001'}, {name: 'tom1', mdate: '202008'}, {name: 'tom3', mdate: '202005'} ] // 使用:按照属性 mdate 给data排序 let sortedArr = data.sort(dynamicSort("mdate"))
-
多属性排序
function dynamicSortMultiple() { /* * 保存arguments对象,因为它将被覆盖 * 注意arguments对象是一个类似数组的对象 * 由要排序的属性的名称组成 */ var props = arguments return function (obj1, obj2) { var i = 0, result = 0, numberOfProperties = props.length // 从0开始获取不同的结果,因为有多个属性需要比较 while(result === 0 && i < numberOfProperties) { result = dynamicSort(props[i])(obj1, obj2) i++ } return result } } // 使用:按照属性 name 和 mdate 给data排序 let sortedArr = People.sort(dynamicSortMultiple("name", "mdate"));
-
也可以使用
ES6
,它允许扩展原生对象class MyArray extends Array { sortBy(...args) { return this.sort(dynamicSortMultiple.apply(null, args)) } } // 使用:按照属性 mdate 给data排序 let sortedArr = MyArray.from(data).sortBy("mdate")
备注
- 注意多属性排序中有一行代码
dynamicSort(props[i])(obj1, obj2)
,因为dynamicSort
函数返回一个函数,要执行这个函数所以使用了两个括号。 - f() 执行f函数,返回子函数。
- f()() 执行子函数,返回孙函数。
- 括号越多越往里面执行
相关文章
- Java反射机制(三):调用对象的私有属性和方法
- 如何在SpriteBuilder中设置对象的通用属性
- 如何取得ChipmunkConstraint实例对象的私有属性
- JavaScript对象访问器属性
- 深入了解VSTS的Unit Test测试属性
- Js基础知识2-对象、对象属性全解
- is_unique 属性检查给定 Series 对象中的基础数据是否唯一
- 使用属性升级MyBank
- 关于使用JAXB读取xml文档转换为java对象报错:类的两个属性具有相同名称com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExc...
- JSP中scope属性 scope属性决定了JavaBean对象存在的范围
- JS魔法堂:关于元素位置和鼠标位置的属性
- activity属性_ _activity 属性说明
- List stream 对象 属性去重
- fastjson转换对象,属性首字母大小写的问题
- 大数据多属性的数据架构设计
- 全面了解python中的类,对象,方法,属性
- C# DataGridView的列对象属性探讨 (未完待续)
- Atiitt 对象转换json 序列化规范 Java 循环引用的解决 设置序列化层次深度 去除不必的属性 太长不方便月度 jsonObject.remove("num1"); Prety fo
- Android平台上使用属性系统(property system)
- BigData:数据中台相关术语概念简介—数据域/业务过程/业务域/指标字典/指标类型/原子指标/派生指标/度量/维度/维度属性/时间周期/修饰词/修饰类型等之详细攻略
- 行测图形推理笔记-元素置换、叠加运算、曲直属性、开闭属性
- 【OpenCV 例程300篇】200.轮廓的基本属性
- python3(十三)File对象的属性