【问题标题】:Javascript - sorting array by multiple criteriaJavascript - 按多个标准对数组进行排序
【发布时间】:2015-02-17 11:20:05
【问题描述】:

我有一个对象数组:

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'}
];

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

【问题讨论】:

  • 在共享代码时使用代码示例而不是代码 sn-p。运行时使用代码 sn-p。
  • 对第一个数字进行排序。当keyA == keyB 时为第二个数字添加另一个标准。

标签: javascript arrays sorting


【解决方案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;
  if (keyA2 < keyB2) return -1;
  if (keyA2 > keyB2) return 1;
  return 0;
});

【讨论】:

  • 谢谢亚历克斯。工作一种享受。
  • 无法完全理解它是如何工作的,但确实可以。将查找文档。谢谢!
【解决方案2】:

这是一个更简洁、更简洁的版本,不需要一堆嵌套的 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;

});

【讨论】:

  • 迄今为止最简单、最干净的解决方案。它之所以有效,是因为当 a 和 b 相同时,值为零,这意味着它会移动到下一个 OR 操作数,依此类推。
【解决方案3】:

在伪代码中,逻辑如下:

过程:比较器(a,b)

  1. 如果a &lt; b 那么return -1
  2. 如果a = b,则递归调用comparator(a1, b1),其中a1b1是排序中下一级的可比值。
  3. 如果a &gt; b 那么return 1

在你的具体情况下,你可以通过稍微修改你的代码来做到这一点:

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;
    }
}

【讨论】:

    【解决方案4】:

    创建一个类似这样的比较函数:

    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;
    });
    

    【讨论】:

      【解决方案5】:

      另一种可能性是根据多个比较器函数组成一个排序函数。这是一个可以执行此操作的示例函数:

      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 将这个想法提升到了一个新的水平。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        相关资源
        最近更新 更多