首先按文本排序,然后按字母数字字符串上的数字排序
Sorting first by text then by number on alpha numeric strings
我有一个这样的数组
["1","0K","11",1,"KE","PQ",5,"5"]
我希望它先按文本排序,然后按数字排序,如下所示
["KE","PQ","0K","1",1,5,"5","11"]
我用了local compare
,但好像没用。
function desc(a,b){
//below is the code that needs improvement
return b.toString().localeCompare(a, undefined, {
numeric: true,
sensitivity: "base",
});
}
function sort(order) {
return order === "desc"
? (a, b) => desc(a, b)
: (a, b) => -desc(a, b);
}
function stableSort(array, cmp){
const stabilizedThis = array.map((el, index) => [el, index]);
stabilizedThis.sort((a, b) => {
const order = cmp(a[0], b[0]);
if (order !== 0) return order;
return (a[1]) - (b[1]);
});
return stabilizedThis.map((el) => el[0]);
}
var arr = ["1","0K","11",1,"KE","PQ",5,"5"];
console.log(stableSort(arr, sort("asc")))
您可以编写 filter
方法来获取 strings containing numbers
,删除条目,从 rest
中分别获取 numbers
和 strings
,然后对它们进行排序以你喜欢的方式。
const data = ["1","0K","11",1,"KE","PQ",5,"5"];
const stringsWithNumbers = data.filter(x => /\d+[a-zA-Z]/.test(x));
const rest = data.filter(x => !stringsWithNumbers.includes(x));
const numbers = rest.filter((x) => parseInt(x, 10));
const words = rest.filter((x) => !parseInt(x, 10));
const result = [
...words.sort((a, b) => a.localeCompare(b)),
...stringsWithNumbers.concat(numbers).sort((a, b) => parseInt(a) - parseInt(b)),
];
console.log(result);
const sort = (arr = []) => {
const nonAlpha = /[^a-zA-Z]/g, nonNum = /[^0-9]/g;
return arr.sort((a, b) => {
const aStr = String(a), bStr = String(b);
const aAlpha = aStr.replace(nonAlpha, ""), bAlpha = bStr.replace(nonAlpha, "");
const alphaCompare = bAlpha.localeCompare(aAlpha);
if(alphaCompare) return alphaCompare;
const aNum = +aStr.replace(nonNum, ""), bNum = +bStr.replace(nonNum, "");
return aNum - bNum;
});
}
console.log( sort(["1","0K","11",1,"KE","PQ",5,"5"]) );
var arr = ["1","OK","11",1,"KE","PQ",5,"5"]
var wordArr = []
var numArr = []
arr.forEach((el) => {
if(Number(el)){
numArr.push(el)
} else {
wordArr.push(el)
}
});
wordArr.sort()
numArr.sort((a, b) => a - b)
arr = wordArr.concat(numArr)
console.log(arr)
我有一个这样的数组
["1","0K","11",1,"KE","PQ",5,"5"]
我希望它先按文本排序,然后按数字排序,如下所示
["KE","PQ","0K","1",1,5,"5","11"]
我用了local compare
,但好像没用。
function desc(a,b){
//below is the code that needs improvement
return b.toString().localeCompare(a, undefined, {
numeric: true,
sensitivity: "base",
});
}
function sort(order) {
return order === "desc"
? (a, b) => desc(a, b)
: (a, b) => -desc(a, b);
}
function stableSort(array, cmp){
const stabilizedThis = array.map((el, index) => [el, index]);
stabilizedThis.sort((a, b) => {
const order = cmp(a[0], b[0]);
if (order !== 0) return order;
return (a[1]) - (b[1]);
});
return stabilizedThis.map((el) => el[0]);
}
var arr = ["1","0K","11",1,"KE","PQ",5,"5"];
console.log(stableSort(arr, sort("asc")))
您可以编写 filter
方法来获取 strings containing numbers
,删除条目,从 rest
中分别获取 numbers
和 strings
,然后对它们进行排序以你喜欢的方式。
const data = ["1","0K","11",1,"KE","PQ",5,"5"];
const stringsWithNumbers = data.filter(x => /\d+[a-zA-Z]/.test(x));
const rest = data.filter(x => !stringsWithNumbers.includes(x));
const numbers = rest.filter((x) => parseInt(x, 10));
const words = rest.filter((x) => !parseInt(x, 10));
const result = [
...words.sort((a, b) => a.localeCompare(b)),
...stringsWithNumbers.concat(numbers).sort((a, b) => parseInt(a) - parseInt(b)),
];
console.log(result);
const sort = (arr = []) => {
const nonAlpha = /[^a-zA-Z]/g, nonNum = /[^0-9]/g;
return arr.sort((a, b) => {
const aStr = String(a), bStr = String(b);
const aAlpha = aStr.replace(nonAlpha, ""), bAlpha = bStr.replace(nonAlpha, "");
const alphaCompare = bAlpha.localeCompare(aAlpha);
if(alphaCompare) return alphaCompare;
const aNum = +aStr.replace(nonNum, ""), bNum = +bStr.replace(nonNum, "");
return aNum - bNum;
});
}
console.log( sort(["1","0K","11",1,"KE","PQ",5,"5"]) );
var arr = ["1","OK","11",1,"KE","PQ",5,"5"]
var wordArr = []
var numArr = []
arr.forEach((el) => {
if(Number(el)){
numArr.push(el)
} else {
wordArr.push(el)
}
});
wordArr.sort()
numArr.sort((a, b) => a - b)
arr = wordArr.concat(numArr)
console.log(arr)