JavaScript 数组对象中属性值为字符串时的多重排序

476 阅读1分钟

排序函数 - 递归方式

function multiple_sort(arr) {
  var prop, size
  return function(a, b) {
    function multiple_compare(a, b, arr) {
      prop = arr.shift()
      if (prop) {
        size = a[prop].localeCompare(b[prop])
        if (!size) {
          return multiple_compare(a, b, arr)
        }
        return size
      }
      return 0
    }
    return multiple_compare(a, b, arr.slice())
  }
}

排序函数 - while 方式

function multiple_sort(arr) {
  return function(a, b) {
    var size,
      i = 0
    do {
      size = arr[i++](a, b)
    } while (size === 0 && i < arr.length)
    return size
  }
}

使用

const data = [
  {
    x1: 'w1',
    x2: 'fb',
    x3: 'pc'
  },
  {
    x1: 'w2',
    x2: 'fb',
    x3: 'pc'
  },
  {
    x1: 'w1',
    x2: 'gg',
    x3: 'pc'
  },
  {
    x1: 'w2',
    x2: 'gg',
    x3: 'pc'
  },
  {
    x1: 'w1',
    x2: 'fb',
    x3: 'ios'
  }
]

// 方式一使用
data.sort(multiple_sort(['x1', 'x2', 'x3']))

// 方式二使用
const x1_compare = function(a, b) {
  return a.x1.localeCompare(b.x1)
}
const x2_compare = function(a, b) {
  return a.x2.localeCompare(b.x2)
}
const x3_compare = function(a, b) {
  return a.x3.localeCompare(b.x3)
}

data.sort(multiple_sort([x1_compare, x2_compare, x3_compare]))

笔记

  1. 方式一不能对不同属性进行不同大小逻辑判断,方式二反之
  2. 方式一调用比较简洁,方式二可定制化,各有利弊
  3. 方式一如果需要对不同属性进行不同大小排序,可传入一个数组对象进去做判断,如下调用:
    data.sort(
      multiple_sort([
        { prop: 'x1', sort: 'desc' },
        { prop: 'x2', sort: 'asc' }
      ])
    )
    

原文地址: github.com/liurongqing…