使用大写和小写字母对特定情况进行排序比较器
Sorting comparator for specific case with upper and lowercase letters
我有一个这样的合并排序脚本:
function mergeSort(arr){
var len = arr.length;
if(len <2)
return arr;
var mid = Math.floor(len/2),
left = arr.slice(0,mid),
right =arr.slice(mid);
//send left and right to the mergeSort to broke it down into pieces
//then merge those
return merge(mergeSort(left),mergeSort(right));
}
function merge(left, right){
var result = [],
lLen = left.length,
rLen = right.length,
l = 0,
r = 0;
while(l < lLen && r < rLen){
if(left[l] < right[r]){
result.push(left[l++]);
}
else{
result.push(right[r++]);
}
}
//remaining part needs to be addred to the result
return result.concat(left.slice(l)).concat(right.slice(r));
}
console.log(mergeSort(['a', 'B', 'b', 'A', 'c']))
输出是:
["A", "B", "a", "b", "c"]
我想要
这样的订单
["A", "a", "B", "b", "c"]
toLowerCase() 方法将不起作用,因为它可以 return 像这样:
["A", "a", "b", "B", "c"]
此致
基本上你可以先比较小写字符,如果相等,然后反转 String#localeCompare
的结果。
var array = ['a', 'B', 'b', 'A', 'c'];
array.sort(function (a, b) {
var aa = a.toLowerCase(),
bb = b.toLowerCase();
return aa.localeCompare(bb) || b.localeCompare(a);
});
console.log(array);
用你的代码
function compare(a, b) {
var aa = a.toLowerCase(),
bb = b.toLowerCase();
return aa.localeCompare(bb) || b.localeCompare(a);
}
function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var mid = Math.floor(len / 2),
left = arr.slice(0, mid),
right = arr.slice(mid);
//send left and right to the mergeSort to broke it down into pieces
//then merge those
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var result = [],
lLen = left.length,
rLen = right.length,
l = 0,
r = 0;
while (l < lLen && r < rLen) {
if (compare(left[l], right[r]) < 0) { // use comparing function and check
result.push(left[l++]); // against zero for smaller values
} else {
result.push(right[r++]);
}
}
//remaining part needs to be addred to the result
return result.concat(left.slice(l)).concat(right.slice(r));
}
console.log(mergeSort(['a', 'B', 'b', 'A', 'c']))
.as-console-wrapper { max-height: 100% !important; top: 0; }
您需要做的就是更改行中的 if 语句
if(left[l] < right[r])
当小写字符相等时检查小写字符和大小写的东西
if(
left[l].toLowerCase() < right[r].toLowerCase() ||
(left[l].toLowerCase() == right[r].toLowerCase() && left[l] < right[r])
)
最好的问候
我有一个这样的合并排序脚本:
function mergeSort(arr){
var len = arr.length;
if(len <2)
return arr;
var mid = Math.floor(len/2),
left = arr.slice(0,mid),
right =arr.slice(mid);
//send left and right to the mergeSort to broke it down into pieces
//then merge those
return merge(mergeSort(left),mergeSort(right));
}
function merge(left, right){
var result = [],
lLen = left.length,
rLen = right.length,
l = 0,
r = 0;
while(l < lLen && r < rLen){
if(left[l] < right[r]){
result.push(left[l++]);
}
else{
result.push(right[r++]);
}
}
//remaining part needs to be addred to the result
return result.concat(left.slice(l)).concat(right.slice(r));
}
console.log(mergeSort(['a', 'B', 'b', 'A', 'c']))
输出是:
["A", "B", "a", "b", "c"]
我想要
这样的订单["A", "a", "B", "b", "c"]
toLowerCase() 方法将不起作用,因为它可以 return 像这样:
["A", "a", "b", "B", "c"]
此致
基本上你可以先比较小写字符,如果相等,然后反转 String#localeCompare
的结果。
var array = ['a', 'B', 'b', 'A', 'c'];
array.sort(function (a, b) {
var aa = a.toLowerCase(),
bb = b.toLowerCase();
return aa.localeCompare(bb) || b.localeCompare(a);
});
console.log(array);
用你的代码
function compare(a, b) {
var aa = a.toLowerCase(),
bb = b.toLowerCase();
return aa.localeCompare(bb) || b.localeCompare(a);
}
function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var mid = Math.floor(len / 2),
left = arr.slice(0, mid),
right = arr.slice(mid);
//send left and right to the mergeSort to broke it down into pieces
//then merge those
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var result = [],
lLen = left.length,
rLen = right.length,
l = 0,
r = 0;
while (l < lLen && r < rLen) {
if (compare(left[l], right[r]) < 0) { // use comparing function and check
result.push(left[l++]); // against zero for smaller values
} else {
result.push(right[r++]);
}
}
//remaining part needs to be addred to the result
return result.concat(left.slice(l)).concat(right.slice(r));
}
console.log(mergeSort(['a', 'B', 'b', 'A', 'c']))
.as-console-wrapper { max-height: 100% !important; top: 0; }
您需要做的就是更改行中的 if 语句
if(left[l] < right[r])
当小写字符相等时检查小写字符和大小写的东西
if(
left[l].toLowerCase() < right[r].toLowerCase() ||
(left[l].toLowerCase() == right[r].toLowerCase() && left[l] < right[r])
)
最好的问候