记住比较器函数的参数顺序有什么技巧?

问题描述 投票:0回答:2

在 javascript(或许多其他语言)中,有一个像 Array.prototype.sort 这样的方法。它需要一个参数,该参数是一个如下所示的函数:

 array.sort( compare )

假设我想按升序对数组进行排序。我很难记住这个函数是否应该是这样的:

 array.sort( function compare(a,b){
     if ( a < b ){ return -1 }
     if ( a > b ){ return 1 }
     return 0;
 })

或者像这样

 array.sort( function compare(a,b){
     if ( a < b ){ return 1 }  // NOTE that -1 and 1 are swapped here!
     if ( a > b ){ return -1 }
     return 0;
 })

我厌倦了一直在谷歌上搜索这个。有没有什么记忆技巧或者助记符?

javascript sorting comparison comparison-operators
2个回答
2
投票

规则:升序排序,如果比较函数的第一个参数较大,则返回1。

这里的关键词是“上升”、“第一”、“更大”和“1”。在每种情况下,想想什么是“更好”:

  • “上升”更好。 想想“攀登阶梯”和“迎接挑战”。
  • “第一”更好。 想想“第一名”和“第一名”。
  • “更大”更好。这种陈词滥调已经存在。 '纳夫说。
  • “积极”更好。 思考“积极态度”和“积极结果”。 (或者,“加”也更好。认为“这是一个很大的加”。)

然后您在编写代码时可以考虑以下内容:

var array = [3,2,1,2];

document.write('unsorted array: ' + array + '</br>');

var POSITIVE =  1;
var SAME     =  0;
var NEGATIVE = -1;

array.sort(function compare(firstParam, secondParam) {

  var theyAreTheSame = (firstParam === secondParam);
  // that shouldn't require any memory aid

  var firstIsBigger  = (firstParam  >  secondParam);

  if      (theyAreTheSame) return SAME
  else if (firstIsBigger ) return POSITIVE // the key line
  else                     return NEGATIVE;

});

document.write('sorted array: ' + array);

这导致以下结果:

  • 以更好的顺序排序(即升序)...
  • ...如果更好的参数(即第一个)...
  • ...是更好的相对尺寸(即更大)...
  • ...那么应该从比较函数返回更好的值(即正值)。

(免责声明:我没有声明这种记忆辅助对于其他语言甚至其他函数的实用性,但是,嘿,希望它对使用 Javascript 数组排序的人有所帮助!)

更新:通过将 'let' 和 'const' 替换为 'var' 来修复代码(即将变量声明从 ES6 恢复到 ES5),以便代码不仅可以在 Firefox 中运行,还可以在 Chrome 和 Safari 中运行。 (我没有检查过 Internet Explorer 或其他浏览器。)


0
投票

我已经经历了同样的痛苦很长一段时间了,但这现在结束了..至少让我尝试一下:)

让我们暂时忘记内置的

sort()
,让我们看看这个排序算法

function bubbleSort(arr, comparator) {
    let len = arr.length;
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len - i - 1; j++) {
            // If the comparator function returns a positive number, it means arr[j] > arr[j + 1]
            if (comparator(arr[j], arr[j + 1]) > 0) {
                // Swap arr[j] and arr[j + 1]
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
}

let numbers = [40, 1, 5, 200];
bubbleSort(numbers, (a, b) => a - b); // sorts the array numerically and ascending
console.log(numbers); // [1, 5, 40, 200]

你注意到什么了吗?

  • 仅考虑值..当时..然后执行您的操作..执行交换

现在重要的部分:

对于类似

(a, b)
.. 当您需要进行交换时返回正值

如果您需要更大

arr.sort((a, b) => {
  if (a < b) {
    return 1 // Positive: Do your action .. Do the Swapping
  }
  // else ...
})

这意味着,如果

a
很小..那么进行交换..因为我们首先需要更大的

© www.soinside.com 2019 - 2024. All rights reserved.