-2

尝试使用 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?

此外,如果我通过 sort 这个函数:

words = words.sort(function(a,b){
    return a - b;
});

结果未排序:

["4,catt", "5,battt", "3,mat"]
["2,as", "10,assssvvvvt", "6,affggg"]

我希望澄清一下我应该如何期望 sort 方法的行为,以及如何使它对这些字符串进行排序!谢谢

4

2 回答 2

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; });

(当然,对于示例情况,第二种方法是不必要的,但在其他情况下可能有用。)

小提琴

于 2013-10-11T17:44:04.100 回答
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) 
});
于 2013-10-11T17:46:56.077 回答