zoukankan      html  css  js  c++  java
  • 根据对象数组中的一个或多个属性给数组排序

    这篇文章主要介绍了如何按照一个或多个属性给一个对象数组排序。

    需求

    后台返回的数据需要按照一定的顺序展示,可以根据其中一个属性或多个属性。

    解决办法

    • 单属性排序

      // 创建动态排序函数,根据传递的值对对象进行排序:
      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()() 执行子函数,返回孙函数。
    • 括号越多越往里面执行
  • 相关阅读:
    sql语句添加查询字段
    SqlServer Case when then用法总结
    单例与多线程
    HttpSession详解
    范式
    SQL语句中的Having子句与where子句
    HTTP无状态
    字节流与字符流的区别
    选择排序
    ReentrantLock VS synchronized
  • 原文地址:https://www.cnblogs.com/codebook/p/12630026.html
Copyright © 2011-2022 走看看