为什么按字母排序数字输入?

时间:2017-07-26 20:48:03

标签: javascript string sorting

为什么这个函数返回元素按字母顺序排序而不是数字排序?无论是使用Number还是ParseFloat,我都会得到相同的结果。

function sortMe() {
  var x = ["1.0","2.5", "11.0"];
  var y = x.map(Number);
  Logger.log(y.sort());
}

结果:1,11,2.5

4 个答案:

答案 0 :(得分:2)

由于Array#sort按字母顺序排序,因此'11'位于'2'之前。

  

sort() 方法对数组in place的元素进行排序并返回数组。排序不一定是stable。默认排序顺序是根据字符串Unicode代码点。

要解决此问题,您可以使用带回调的数字排序,例如

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

答案 1 :(得分:1)

这是因为默认排序顺序是根据字符串Unicode代码点,无论您输入什么。 <{1}}被隐式转换回字符串然后排序。

答案 2 :(得分:0)

并不是说你无法传递数字数组,无论你传递Array#sort,它都会尝试根据它们的unicode表示进行比较。而是传递比较器,以比较排序时的比较方式

y.sort((a,b)=>a-b)

答案 3 :(得分:-1)

sort()方法对数组的项进行排序。

排序顺序可以是字母顺序或数字顺序,也可以是升序(向上)或降序(向下)。

默认情况下,sort()方法根据每个元素的Unicode点值,按字母顺序和升序将值排序为字符串。

看一下这个例子:

var fruit = ['cherries', 'apples', 'bananas'];
fruit.sort(); // ['apples', 'bananas', 'cherries']

var scores = [1, 10, 21, 2]; 
scores.sort(); // [1, 10, 2, 21]
// Note that 10 comes before 2,
// because '10' comes before '2' in Unicode code point order.

var things = ['word', 'Word', '1 Word', '2 Words'];
things.sort(); // ['1 Word', '2 Words', 'Word', 'word']
// In Unicode, numbers come before upper case letters,
// which come before lower case letters.