我无法理解“返回”值对排序的影响

时间:2017-02-26 07:57:39

标签: javascript compare

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
  // how minus 1 will affect to sort? how sort will understand this value? 
 return -1; 
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
} 

或在下一个例子中:

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

我知道只知道“真”或“假”,它们分别为1和0.以及如何比较和排序,了解那是什么(1,-1,0)以及如何使用这些值进行排列?< / p>

2 个答案:

答案 0 :(得分:1)

Array.prototype.sort函数要求回调返回一个数字,而不是布尔值(例如,不是truefalse)。它使用数字来知道它给排序回调应该是两个条目的顺序。你可以想象sort中的逻辑是这样的:

result = callback(a, b);
if (result < 0) {
    // Make sure `a` is before `b`
} else if (result > 0) {
    // Make sure `b` is before `a`
} else {
    // It doesn't matter which is first, they're equivalent
}

如您所见,truefalse不参与(<>的结果除外)。

这意味着如果ab是数字且回调返回a - b,则会按数字排序,因为如果a小于b },结果将是负面的;如果a大于b,则结果为正;如果它们相同,则结果为0

答案 1 :(得分:0)

documentation at MDN很好地描述了这一点:

  

arr.sort(compareFunction)

     

如果提供compareFunction,则对数组元素进行排序   根据比较函数的返回值。如果a和b是   比较两个要素,然后:

     
      
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先到。
  •   
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但相对于所有   不同的元素。注意:ECMAscript标准不是   保证这种行为,因此并非所有浏览器(例如Mozilla
      至少可以追溯到2003年的版本)尊重这一点。
  •   
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。 compareFunction(a,b)必须始终返回相同的值   给定一对特定元素a和b作为其两个时的值   参数。如果返回不一致的结果,则返回排序顺序   未定义。
  •