我尝试使用sort方法对字符串数组进行排序似乎不一致,无论是否传递sort()函数:
function sortThese(strArr) {
var words = [];
for (var i = 0; i < strArr.length; i++) {
words.push(String(strArr[i].length + "," + strArr[i]));
}
words = words.sort();
console.log(words);
}
sortThese(["battt","catt","mat"]);
sortThese(["as","assssvvvvt","affggg"]);
在这种情况下,我的结果是:
["3,mat", "4,catt", "5,battt"]
["10,assssvvvvt", "2,as", "6,affggg"]
因此看起来该方法将我的“10”视为“1”。
如何让它看到值为10?
另外,如果我通过排序这个功能:
words = words.sort(function(a,b){
return a - b;
});
结果未排序:
["4,catt", "5,battt", "3,mat"]
["2,as", "10,assssvvvvt", "6,affggg"]
我希望能够澄清一下我应该如何期望sort方法的行为,以及如何让它对这些字符串进行排序!谢谢
答案 0 :(得分:1)
“10”出现在“3”之前,因为你已经把它变成了一个字符串(即“1”出现在“3”之前)。如果要按长度排序,可以使用sort函数来比较长度:
words.sort(function(a, b) { return a.length > b.length; });
您还可以创建嵌套对象数组,以便在每个项目中保存数字和字符串:
var words = strArr.map(function(str) {
return { len: str.length, str: str }
});
words.sort(function(a, b) { return a.len > b.len; });
(当然,第二种方法对于示例案例是不必要的,但在其他情况下可能会有用。)
答案 1 :(得分:0)
排序字符串始终使用字母顺序,而不是数字。试想一下0 = A 1 = B 2 = C,依此类推。字母不作为数字连接,因此以1(各自的B)开头的所有内容将在2(相应的C)之前排序。这就是你获得10,2,6的原因。对于10,只有1计数。
使用自定义排序功能是实现此目的的好方法。但你不能减去字符串。之前提取整数并在之后进行比较:
words = words.sort(function(a,b){
//parseInt will read only the first numbers and discard the letters after this
return parseInt(a) - parseInt(b)
});