sort(),sort(function(a,b){return a-b;})之间的区别;和排序(函数(a,b){...})

时间:2016-08-29 09:19:43

标签: javascript arrays sorting

我试图了解sort()的工作原理以及我应该如何使用它。

我做了一些研究(google)并在stackoverflow上查看了类似的问题,但仍然有一些事情不是100%清楚的。

所以到目前为止我的理解如下:

有:

不带参数的sort():仅对字符串按字母顺序的简单数组进行排序,并在升序顺序< / p>

E.g。

// sort alphabetically and ascending:
var myArr=["Bob", "Bully", "Amy"]
myArr.sort() // Array now becomes ["Amy", "Bob", "Bully"]


使用函数作为参数的sort():根据数组属性对数组中的对象进行排序;但是,这些项目会比较为数字

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


使用函数作为参数的sort():根据数组属性对数组中的对象进行排序;这些项目可以是数字字符串

myArr.sort(function(a, b) {
    if (a.sortnumber < b.sortnumber) return -1;
    else if (a.sortnumber > b.sortnumber) return 1;
    return 0;
});


我尝试使用所有这3个sort()函数对以下数组进行排序。

var myArr = [{
  "sortnumber": 9,
  "name": "Bob"
},
{
  "sortnumber": 5,
  "name": "Alice"
},
{
  "sortnumber": 4,
  "name": "John"
},
{
  "sortnumber": 3,
  "name": "James"
},
{
  "sortnumber": 7,
  "name": "Peter"
},
{
  "sortnumber": 6,
  "name": "Doug"
},
{
  "sortnumber": 2,
  "name": "Stacey"
}];

//myArr.sort(); // doesn't do anything since it doesn't know on what property to sort

/*
myArr.sort(function(a, b) {
    return (a.sortnumber - b.sortnumber); // sorts array
    return (a.name - b.name); // doesn't sort array
});
*/

/*
// sorts array even when I use name as property to sort on
myArr.sort(function(a, b) {
    if (a.sortnumber < b.sortnumber) return -1;
    else if (a.sortnumber > b.sortnumber) return 1;
    return 0;
});
*/


console.log(myArr);

Here也是一个小提琴。

所以,我的问题是:

  1. 我的理解是否正确?
  2. 我有什么遗失的吗?
  3. 如果第三种情况始终有效,我是否可以始终坚持下去 其他两种情况在某种程度上更有效率或对其有任何好处 第三种情况?
  4. 如果有人能详细说明上述情况,我将非常感激。谢谢。

5 个答案:

答案 0 :(得分:5)

好的,经过一些额外的研究,通过我发现非常有帮助的MDN documentationarraysortarraysort2链接,我创建了一张可能属于使用给别人,所以我在这里发帖。谢谢大家的答案!

enter image description here

答案 1 :(得分:2)

首先,您做了很好的研究并涵盖了几乎所有可能的案例,您可以找到MDN文档here

您错过了排序非ASCII字符

的情况
  

对于使用非ASCII字符排序字符串,即带有重音字符(e,é,è,a,ä等)的字符串,来自英语以外语言的字符串:使用String.localeCompare。此功能可以比较这些字符,使它们以正确的顺序显示。

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
  return a.localeCompare(b);
});

// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

答案 2 :(得分:1)

根据数组引用(http://www.w3schools.com/jsref/jsref_sort.asp):

By default, the sort() method sorts the values as strings in alphabetical and ascending order.

因此,您对sort()的初步了解是正确的。但是,第二个和第三个还不正确。首先,它们都是相同的情况,它为sort()方法提供了排序功能。此方法应比较ab,并返回负值,零值或正值,指示a是否小于,等于或大于b。例如,您仍然可以使用myArr属性比较name,如下所示:

myArr.sort(function(a,b) {
  return a.name.localeCompare(b.name);
});

答案 3 :(得分:1)

我认为,您希望结合排序条件,例如按名称forst排序然后按数字排序的示例。请观看'John'

&#13;
&#13;
var myArr = [{ "sortnumber": 9, "name": "Bob" }, { "sortnumber": 5, "name": "Alice" }, { "sortnumber": 4, "name": "John" }, { "sortnumber": 3, "name": "James" }, { "sortnumber": 7, "name": "Peter" }, { "sortnumber": 6, "name": "Doug" }, { "sortnumber": 2, "name": "Stacey" }, { "sortnumber": 14, "name": "John" }, { "sortnumber": 12, "name": "John" }];

myArr.sort(function (a, b) {
    return a.name.localeCompare(b.name) ||  a.sortnumber - b.sortnumber;
});

console.log(myArr);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我在“比较函数”部分的 https://www.w3schools.com/js/js_array_sort.asp 找到了这个。希望能帮到你,谢谢:)

比较函数:比较函数的目的是定义替代排序顺序。

比较函数应返回负值、零值或正值,具体取决于参数:

    function(a, b){return a - b}

当 sort() 函数比较两个值时,它将值发送给比较函数,并根据返回的(负、零、正)值对值进行排序。

如果结果为负数 a 排在 b 之前。

如果结果为正,则 b 排在 a 之前。

如果结果为 0,则不会更改两个值的排序顺序。

示例:

比较函数比较数组中的所有值,一次比较两个值 (a, b)。

比较 40 和 100 时,sort() 方法调用比较函数(40, 100)。

该函数计算 40 - 100 (a - b),由于结果为负数 (-60),所以 sort 函数会将 40 排序为小于 100 的值。

您可以使用此代码片段来试验按数字和字母顺序排序:

<html>
<body>

<h2>JavaScript Array Sort</h2>

<p>Click the buttons to sort the array alphabetically or numerically.</p>

<button onclick="myFunction1()">Sort Alphabetically</button>
<button onclick="myFunction2()">Sort Numerically</button>

<p id="demo"></p>

<script>
const points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;  

function myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML = points;
}
function myFunction2() {
  points.sort(function(a, b){return a - b});
  document.getElementById("demo").innerHTML = points;
}
</script>

</body>
</html>