在 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;
})
我厌倦了一直在谷歌上搜索这个。有没有什么记忆技巧或者助记符?
规则:升序排序,如果比较函数的第一个参数较大,则返回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 或其他浏览器。)
我已经经历了同样的痛苦很长一段时间了,但这现在结束了..至少让我尝试一下:)
让我们暂时忘记内置的
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
很小..那么进行交换..因为我们首先需要更大的