Javascript - 按多个标准排序数组

时间:2015-02-17 11:20:06

标签: javascript arrays sorting

我有一个对象数组:

var arr = [
  {title:'50 - 50'},
  {title:'100 - 100'},
  {title:'50 - 65'},
  {title:'100 - 125'}
];

我正在尝试对此数组进行排序,以便项目按以下顺序显示:

var arr = [
  {title:'50 - 50'},
  {title:'50 - 65'},
  {title:'100 - 100'},
  {title:'100 - 125'}
];

目前我正在使用以下排序功能来尝试:

arr.sort(function(a, b){
  var titleA = a.title;
  var titleB = b.title;
  var arrA = titleA.split(' - ');
  var arrB = titleB.split(' - ');
  var keyA = parseInt(arrA[0]), 
      keyB = parseInt(arrB[0]);

  // Compare the 2 keys
  if(keyA < keyB) return -1;
  if(keyA > keyB) return 1;
  return 0;
});

但是,这会按以下顺序返回项目:

var arr = [
  {title:'50 - 65'},
  {title:'50 - 50'},
  {title:'100 - 125'},
  {title:'100 - 100'}
];

看起来我需要按标题中的第一个数字排序,然后按第二个数字排序。有什么想法吗?

5 个答案:

答案 0 :(得分:9)

试试这个:

arr.sort(function(a, b){
  var titleA = a.title;
  var titleB = b.title;
  var arrA = titleA.split(' - ');
  var arrB = titleB.split(' - ');
  var keyA1 = parseInt(arrA[0]), keyA2 = parseInt(arrA[1]) 
      keyB1 = parseInt(arrB[0]), keyB2 = parseInt(arrB[1]);

  // Compare the 2 keys
  if (keyA1 < keyB1) return -1;
  if (keyA1 > keyB1) return 1;
  if (keyA2 < keyB2) return -1;
  if (keyA2 > keyB2) return 1;
  return 0;
});

答案 1 :(得分:8)

在伪代码中,逻辑如下:

程序:比较器(a,b)

  1. 如果a < breturn -1
  2. 如果a = b,则递归致电comparator(a1, b1),其中a1b1是排序中下一级别的可比较值。
  3. 如果a > breturn 1

  4. 在具体案例中,您可以通过稍微修改代码来执行此操作:

    if (keyA < keyB) {
        return -1;
    } else if (keyA > keyB) {
        return 1;
    } else { // keyA == keyB
        if (titleA < titleB) {
            return -1;
        } else if (title > titleB) {
            return 1;
        } else {
            return 0;
        }
    }
    

答案 2 :(得分:6)

这是一个更简洁的版本,不需要一堆嵌套的if / else案例:

const sorted = arr.sort((a,b) => {

    const [a1, a2] = a.title.split(' - ').map(Number);
    const [b1, b2] = b.title.split(' - ').map(Number);

    return a1 - b1 || a2 - b2;

});

答案 3 :(得分:1)

创建一个类似于此的比较函数:

arr.sort(function(a, b){
  var titleA = a.title;
  var titleB = b.title;
  var arrA = titleA.split(' - ');
  var arrB = titleB.split(' - ');
  var keyA1 = parseInt(arrA[0]), 
      keyA2 = parseInt(arrA[1]),
      keyB1 = parseInt(arrB[0]),
      keyB2 = parseInt(arrB[1]),

  // Compare the 2 keys
  if(keyA1 < keyB1) return -1;
  if(keyA1 > keyB1) return 1;
  else
  {
      if(keyA2 < keyB2) return -1;
      if(keyA2 > keyB2) return 1;
      return 0;
});

答案 4 :(得分:0)

另一种可能性是基于多个比较器功能来构成排序功能。这是执行此操作的示例函数:

function makeMultiCriteriaSort (...criteria) {
  return (a, b) => {
    for (let i = 0; i < criteria.length; i++) {
      const curCriteriaComparatorValue = criteria[i](a, b)
      // if the comparison objects are not equivalent, return the value obtained
      // in this current criteria comparison
      if (curCriteriaComparatorValue !== 0) {
        return curCriteriaComparatorValue
      }
    }
    return 0
  }
}

// sort an array with multiple criteria
arr.sort(makeMultiCriteriaSort(comparator1, comparator2))

npm软件包thenby将这一思想带入了一个新的高度。