如何用数字,字母和符号对Javascript中的数组进行排序?

时间:2018-10-11 17:15:54

标签: javascript sorting

我正在尝试用Javascript排序此数组

arr = ["ax", "mof", "4", "63", "42", "3", "10", "[", "23", "adidas", "ba", ")", "ABC"]; 

我希望数组显示如下:

["3", "4", "10", "23", "42", "63", "ABC", "adidas", "ax", "ba", "mof", ")", "["]

也考虑符号“)”,“ [”。

我要成为数组的顺序是:

  1. 从未成年人到市长的人数
  2. 然后,大写字母无所谓。
  3. 最后是符号。

我知道我必须使用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;

我的最后一个问题是如何用数字,字母和符号对数组进行排序

4 个答案:

答案 0 :(得分:4)

使用自定义sort()函数可以实现所需的功能。

这并不容易,可能需要一些“ hacky”方式将“符号”与正常字符区分开。 我使用这种“ hacky”方式,但也许有人可以通过某些regEx或其他方式来提供帮助。

我的技巧是拥有一个可能的符号数组,然后在sort()内,当要比较的itens之一等于其中一个符号时,将其临时更改为字符串{{1} }由于排序方式是从"zzzzzzz""a",因此很可能会移到最后一个位置。

"z"函数需要返回sort()10,因此这就是自定义-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);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters