我正在尝试用Javascript排序此数组
arr = ["ax", "mof", "4", "63", "42", "3", "10", "[", "23", "adidas", "ba", ")", "ABC"];
我希望数组显示如下:
["3", "4", "10", "23", "42", "63", "ABC", "adidas", "ax", "ba", "mof", ")", "["]
也考虑符号“)”,“ [”。
我要成为数组的顺序是:
我知道我必须使用sort()
,但是问题是我无法使用符号对数组进行排序,我遇到了问题
我正在使用该代码显示HTML中的数组和有序数组
var arr, text, larr, i;
arr = ["ax", "mof", "4", "63", "42", "3", "10", "[", "23", "adidas", "ba", ")", "ABC"];
larr = arr.length;
text = "<ul>";
for (i = 0; i < larr; i++) {
text += "<li>" + arr[i] + "</li>";
}
text += "</ul>";
document.getElementById("arrayin").innerHTML = text;
console.log(arr);
var arror,textor, larror, j;
arror = arr.sort();
larror = arror.length;
textor = "<ul>";
for (j = 0; j < larror; j++) {
textor += "<li>" + arror[j] + "</li>";
}
textor += "</ul>";
console.log(arror);
document.getElementById("Oarray").innerHTML = textor;
我的最后一个问题是如何用数字,字母和符号对数组进行排序
答案 0 :(得分:4)
使用自定义sort()
函数可以实现所需的功能。
这并不容易,可能需要一些“ hacky”方式将“符号”与正常字符区分开。 我使用这种“ hacky”方式,但也许有人可以通过某些regEx或其他方式来提供帮助。
我的技巧是拥有一个可能的符号数组,然后在sort()
内,当要比较的itens之一等于其中一个符号时,将其临时更改为字符串{{1} }由于排序方式是从"zzzzzzz"
到"a"
,因此很可能会移到最后一个位置。
"z"
函数需要返回sort()
,1
或0
,因此这就是自定义-1
函数的作用。它首先查看比较单词是否为有效数字,如果是,则进行比较以查看哪个最先出现。然后,如果不是数字,则将其与upperCase中的字符串进行比较,因为您说的大小写无关紧要(使用常规的字典排序)
测试以下代码,看看是否满足您的需要。
compare()
答案 1 :(得分:2)
我将sort
与该自定义比较器功能一起使用。回想一下,如果a
应该在b
之前,比较器应该返回一个正数;如果b
应该在a
之前,则比较器应该返回负数;如果{{1}元素在顺序上是相等的。
0
["ax", "mof", "4", "63", "42", "3", "10", "[", "23", "adidas", "ba", ")", "ABC", "abc"]
.sort((a, b) => {
const aStr = String(a).toLowerCase();
const bStr = String(b).toLowerCase();
// Alphanumeric elements always come before non-alphanumeric elements
const aIsAlphanumeric = isAlphanumeric(aStr);
const bIsAlphanumeric = isAlphanumeric(bStr);
if (aIsAlphanumeric && !bIsAlphanumeric) {
return -1;
} else if (bIsAlphanumeric && !aIsAlphanumeric) {
return 1;
}
// Numerical elements always come before alphabetic elements
const aNum = Number(a);
const bNum = Number(b);
// If both are numerical, sort in the usual fashion (smaller goes first)
if (aNum && bNum) {
return aNum - bNum;
// If a is numerical but b isn't, put a first.
} else if (aNum) {
return -1;
// If b is numerical but a isn't, put b first.
} else if (bNum) {
return 1;
}
// In all other cases, default to usual sort order.
return aStr.localeCompare(bStr);
});
来自this answer,定义如下:
isAlphanumeric
答案 2 :(得分:1)
您猜到了,您必须使用sort方法并传递一个compare函数。为了获得订单,您需要进行以下检查。 完整的jsfiddle示例-https://jsfiddle.net/aczhyk8j/1/
function compare(a, b) {
// check for numberhood
const numA = !isNaN(a);
const numB = !isNaN(b);
if (numA && numB) {
return Number(a) - Number(b);
}
if (numA) return -1;
if (numB) return 1;
// check for wordhood
const wordA = /^[a-zA-Z]+$/.test(a);
const wordB = /^[a-zA-Z]+$/.test(b);
if (wordA && wordB) {
return a.localeCompare(b);
}
if (wordA) return -1;
if (wordB) return 1;
return 1; //or whatever logic to sort within non-alphanumeric values
}
答案 3 :(得分:0)
您可以通过传递比较功能来覆盖默认排序。
function compare(a, b) {
// Check if number, and if number, parse and compare.
// Check other logics
}
arr.sort(compare);