2012-10-08 22 views
6

Powiel możliwe:
How to sort an associative array by its values in Javascript?Jak sortować (asocjacyjną) tablicę według wartości?

Więc po pierwsze wiem technicznie Javascript nie ma tablic asocjacyjnych, ale nie byłem pewien, jak tytuł i otrzymać prawo pomysł poprzek .

Więc tutaj jest kod mam,

var status = new Array(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

I chcę, aby posortować je według wartości takie, że kiedy pętla przez niego później ROB przychodzi pierwszy, a następnie BOB itp

I "Próbowałem,

status.sort() 
status.sort(function(a, b){return a[1] - b[1];}); 

Ale żaden z nich nie wydaje się rzeczywiście robić niczego.

Drukowanie macierzy na konsolę przed i po niej powoduje, że wychodzi ona w tej samej kolejności.

+4

To jest błędne użycie tablic JS. Używaj tylko klawiszy numerycznych z tablicami. '.sort' nie robi nic, ponieważ ściśle mówiąc twoja tablica nie ma żadnych elementów. Musisz w tym przypadku użyć obiektów. Polecam przeczytać [MDN - Praca z obiektami] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects). –

+2

Również: [Sortowanie obiektu JavaScript według wartości właściwości] (http://stackoverflow.com/questions/1069666/sorting-javascript-object-by-property-value). –

+0

Chociaż oznaczono jako duplikat, przedstawione poniżej rozwiązania nie zostały wymienione w duplikacie. – PopeJohnPaulII

Odpowiedz

21

Tablice mogą mieć tylko indeksy numeryczne. Musisz przepisać to jako obiekt lub tablicę obiektów.

var status = new Object(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

lub

var status = new Array(); 
status.push({name: 'BOB', val: 10}); 
status.push({name: 'TOM', val: 3}); 
status.push({name: 'ROB', val: 22}); 
status.push({name: 'JON', val: 7}); 

Jeśli lubisz metodę status.push można sortować je:

status.sort(function(a,b) { 
    return a.val - b.val; 
}); 
+0

Podoba mi się to podejście (Array), jaki byłby właściwy sposób wywoływania i sortowania według 'val'? – PopeJohnPaulII

+0

Zaktualizowałem swoją odpowiedź, aby uwzględnić sortowanie według 'val' z tablicą obiektów. – saml

+0

Świetne i proste rozwiązanie. – Ahsan

2

Pierwszy - To niewłaściwe, aby utworzyć tablicę do używania go jako mapowanie. Zamiast używać obiektu:

var status = {}; 
status['BOB'] = 10; 

tablicy jest klasa z logiki do obsługi indeksów numerycznych-sekwencyjną.

Teraz odpowiadając swoją odpowiedź, Mappings nie mają nakazu, nie ma gwarancji, o kolejności będzie iteracyjne więc nie ma czegoś takiego jak „sortowaniu mapowanie”

I sugest można użyć tablicę obiektów z klucz, wartość:

var status = []; 
status.push({ key: 'BOB', value: 10 }); 

lub dwie tablice:

var status = { 
    keys: [], 
    values: [] 
}; 
status.keys.push('BOB'); 
status.value.push(10); 

To zależy od Twoich potrzeb.

1

Należy użyć obiektu JavaScript wewnątrz tablicy: jsfidle

 var status = new Array(); 
    status.push({key: 'BOB', value: 10}); 
    status.push({key: 'TOM', value: 3}); 
    status.push({key: 'ROB', value: 22}); 
    status.push({key: 'JON', value: 7}); 
    status.sort(function(a, b){ 

     if(a.value > b.value){ 
     return -1; 
     } 
     else if(a.value < b.value){ 
     return 1; 
     } 
     return 0; 
    }); 
+0

To jest dobre dla porównania ciągów znaków – cw24

2

"układy" w JavaScript są indeksowane numerycznie. "Obiekty" są tym, co nazwałbyś tablicą asocjacyjną. "Obiekty" są z natury nieuporządkowane.

Aby to zrobić, trzeba trochę zmienić strukturę danych.

var arr = []; // Array 

// push a few objects to the array. 
arr.push({name: 'BOB', age: 10}); 
arr.push({name: 'TOM', age: 3}); 
arr.push({name: 'ROB', age: 22}); 
arr.push({name: 'JON', age: 7}); 

var sorted = arr.sort(function(a, b) { 
    return a.age - b.age; 
}); 

console.log(sorted); 

enter image description here

+0

Jak sortować według nazwy? –

Powiązane problemy