2012-04-09 10 views
5

Mam JavaScript Object z dwoma array, jak przedstawiono,sortowania tablicy w JavaScript obiektu, utrzymując klucz

var Object = {'name': [Matt, Tom, Mike...], 'rank': [34,1,17...]}; 

Próbuję sortować według rankingu 1,2,3 .. ale zachować nazwę związaną z ranga.

Object.name[0] // tom 
Object.rank[0] // tom's rank of 1. 

Czy powinienem zmienić konfigurację mojego obiektu, aby ułatwić sortowanie?

Jestem obecnie za pomocą

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

zamówić rangę, ale nazwa nie pozostaje z nim.

Cała pomoc doceniona. Dzięki!

+1

Lepiej zmienić swój obiekt do przechowywania danych w innym formacie i przedmiot jest zły nazwa zmiennej. – epascarello

+3

'var Object = {....' really? – Mohsen

+0

Mój obiekt nie jest nazwany obiektem. Po prostu myślałem, że będzie prostsze ... chyba nie .. – mattyd

Odpowiedz

4

Tak, ponownie skonfiguruj.Załóżmy, że miał to zamiast:

var people = [{name:"Matt", rank:34}, {name:"Tom", rank:1}, {name:"Mike", rank:17}]; 

Następnie można rozwiązać tak:

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

Edycja

Skoro masz list równoległe, po prostu spakować je razem:

var people = []; 
for (var i = 0; i < Object.name.length; i++) { 
    people.push({name:Object.name[i], rank:Object.rank[i]}); 
} 
+0

dzięki! Wiedziałem, że musi to być bardziej intuicyjne. – mattyd

+0

tak. Mam obiekt moich ludzi, jak pokazujesz. [{name: val}, {name: val}], ale staram się ostrzec (people.name [0]), a także mój var, gdy został utworzony bez funkcji, oraz z asynchronicznym: false POST, może nie używać poza kodem ... Jakieś pomysły? – mattyd

+1

To faktycznie będzie "ludzie [0] .nazwa". – jpsimons

0

Będziesz musiał napisać własną funkcję sortowania, która dla każdej operacji sortowania będzie pamiętała, który indeks przychodzi z punktu widzenia iteracji w tablicy rang. Wykonuje ten sam ruch z indeksu źródłowego do indeksu docelowego w tablicy nazw. (edytuj) Jeden algortihm do tego z czubka mojej głowy to bąbelki, sprawdź to.

Inną opcją jest poszukiwanie jakiejś implementacji kolekcji "map".

1

Cóż, tak, jeśli i-ten obiekt w tablicy names jest podłączony do i-tego obiektu w tablicy rank, należy go reprezentować w ten sposób. Oznacza to, że powinieneś użyć obiektu o dwóch właściwościach: name i rank.

// person constructor 
function Person(name, rank) { 
    this.name = name; 
    this.rank = rank; 
} 

// create the object with the array 
var myObject = { 
    myArray: new Array() 
}; 

// populate the array 
myObject.myArray.push(new Person('Matt', 34)); 
myObject.myArray.push(new Person('Tom', 1)); 
myObject.myArray.push(new Person('Mike', 17)); 

// sort the Person objects according to their ranks 
myObject.myArray.sort(function(a, b) { 
    return b.rank - a.rank;  
}); 
+0

Świetnie! wygląda solidnie. Zrobię to! – mattyd

+0

W tym przypadku nie mamy pewności, czy utworzenie specjalnego obiektu Person ma jakąkolwiek przewagę nad obiektem generycznym. Sądzę, że w późniejszym czasie możesz chcieć zrobić "instanceof" na tym? – jpsimons

+0

@darkporter Cóż, trudno powiedzieć z jednego fragmentu kodu, prawda? Może przydałby się specjalny obiekt Person do dalszej funkcjonalności, może wcale ... – Imp

2

Obiekt świata rzeczywistego:

o = {name: ['Matt', 'Tom', 'Mike'], rank: [34,1,17]}; 

Złóż tablicę lepszej struktury danych:

var arr =[]; 
o.name.forEach(function(name, i){ 
     arr.push({name: name, rank: o.rank[i]}) 
}); 

Sortuj według rankingu:

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

Sortuj wg nazwy:

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

powrócić do swojej pierwotnej struktury danych:

o = {name:[], rank:[]} 
arr.forEach(function(item){ 
    o.name.push(item.name); 
    o.rank.push(item.rank); 
}); 
+0

forEach jest ładne. Czy to jest rozszerzenie Mozilli, czy jest to przeglądarka? – jpsimons

+0

['ForEach'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) jest dostępny w większości przeglądarek i może mieć zabezpieczenie w starszych przeglądarkach. – Mohsen

+0

Dzięki Mohsen! Najbardziej podobają mi się metody forEach do rekonfiguracji bieżącego obiektu – mattyd

Powiązane problemy