2016-08-29 22 views
5

Próbuję zrozumieć, jak dokładnie działa sort() i jak mam go używać.Różnica między sort(), sort (funkcja (a, b) {return a-b;}); i sortowanie (funkcja (a, b) {...})

Zrobiłem kilka badań (google) i przeszedł podobne pytania tutaj na stackoverflow, ale nadal istnieje kilka rzeczy, które nie są w 100% jasne dla mnie.

Więc moje rozumienie tej pory jest następujący:

Są to:

sort() bez parametrów: sortuje tylko proste tablice String wartości alfabetycznie aw rosnąco zamówienie

Np

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


sortowania() z funkcji jako parametr: sortowanie przedmiotów w macierzy zgodnie z ich właściwościami; elementy są jednak w porównaniu z grupą numerów

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


sortowania() z funkcji jako parametr: sortowanie przedmiotów w macierzy zgodnie z ich właściwościami; elementy mogą być numery lub Struny

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


Próbowałem sortowania następującą tablicę z wszystkich tych funkcji sort (3).

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 również skrzypce.

Więc moje pytania to:

  1. Czy moje rozumienie jest poprawne?
  2. Czy jest coś, czego mi brakuje?
  3. Jeśli trzeci przypadek działa przez cały czas, czy zawsze mogę się do niego przykleić, czy też są dwa inne przypadki bardziej wydajne lub mają jakieś zalety w trzecim przypadku?

Byłbym bardzo wdzięczny, gdyby ktoś mógł rozwinąć powyższe. Dziękuję Ci.

+0

Użyj pierwszej lub trzeciej metody, jeśli potrzebujesz obsługiwać stare przeglądarki IE. – Maris

+0

_Czy jest coś, czego mi brakuje? _ Takie pytania są nie na temat. Tutaj mamy do czynienia tylko z ** konkretnymi ** problemami. – hindmost

+1

@hindmost: Czy jest coś szczególnego, czego mi brakuje w określonym temacie, to w jaki sposób pytanie ma być czytane. – Setily

Odpowiedz

3

Ok, więc po pewnym dodatkowych badań, przechodząc przez MDN documentation, a arraysort i arraysort2 linki, które znalazłem bardzo pomocne, stworzyłem slajd, który prawdopodobnie może mieć zastosowania do ktoś inny, więc zamieszczam go tutaj. Dziękuję wszystkim za odpowiedzi!

enter image description here

2

Przede wszystkim, zrobił dobre badania i objęte niemal wszystkie możliwe przypadki, można znaleźć w dokumentacji MDN here

po prostu zmarnować przypadek Sortowanie znaków spoza ASCII

Do sortowania ciągów znaków spoza zestawu ASCII, tj. Ciągów znaków akcentowanych (e, é, è, a, ä itp.), Ciągi znaków z języków innych niż angielski: użyj String.localeCompare. Ta funkcja może porównać te znaki, aby pojawiły się we właściwej kolejności.

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é'] 
1

Według odniesienia Array (http://www.w3schools.com/jsref/jsref_sort.asp):

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

Więc najpierw zrozumienie o sort() jest poprawna. Jednak drugi i trzeci nie są jeszcze poprawne. Przede wszystkim są one tym samym przypadkiem, który zapewnia funkcję sortowania do metody sort(). Ta metoda powinna porównywać wartości ujemne, zerowe lub dodatnie, wskazując, że jeśli a jest mniejsza niż, równa lub większa niż . Tak na przykład, nadal można porównać myArr pomocą właściwości name tak:

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

myślę, chcesz połączyć kryteria sortowania, jak ten przykład, który Sortuj według nazw Forst, a następnie przez liczbę. Proszę obejrzeć 'John'.

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

Powiązane problemy