2012-04-09 20 views
5

Ho un oggetto JavaScript con due serie di come mostrato,javascript array in oggetto sorta, mantenendo chiave

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

sto cercando di ordinare per rango 1,2,3 .. ma mantenere il nome associato al rango.

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

Devo riconfigurare il mio oggetto per facilitare l'ordinamento?

Attualmente sto usando il

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

ordinare rango, ma il nome non rimane con esso.

Tutti apprezzati. Grazie!

+1

meglio cambiare l'oggetto per contenere i dati in un formato e oggetto diverso è un nome di variabile male. – epascarello

+3

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

+0

Il mio oggetto non è un oggetto con nome ... Ho solo pensato che sarebbe stato più semplice ... non lo so .. – mattyd

risposta

4

Sì, riconfigurare.Diciamo che ha avuto questo, invece:

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

Poi si potrebbe risolvere in questo modo:

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

Modifica

Dal momento che hai liste parallele, basta zip insieme:

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

grazie! Sapevo che doveva esserci un modo più intuitivo attorno a questo. – mattyd

+0

così. Ho il mio popolo obietto mentre mostri. [{nome: val}, {nome: val}], ma sto cercando di mettere in guardia (people.name [0]) e anche il mio var, mentre creato con fuori dalla funzione, e con un async: falso POST, può non essere usato al di fuori del codice ... Qualche idea? – mattyd

+1

Questo sarebbe in realtà 'persone [0] .name'. – jpsimons

0

Dovrai scrivere la tua funzione di ordinamento che per ogni operazione di ordinamento, ricorda quale indice viene dove per iterazione nell'array dei ranghi. Lo stesso passaggio dall'indice sorgente all'indice di destinazione nella matrice dei nomi. (modifica) Un algortihm per questo dalla cima della mia testa è il bubblesort, cercalo.

L'altra opzione è cercare una sorta di implementazione della "mappa".

1

Bene, sì, se l'i-esimo oggetto nell'array names è connesso all'oggetto i-es nell'array rank, è necessario rappresentarlo in questo modo. Ciò significa che è necessario utilizzare un oggetto Person (o qualsiasi cosa esso sia) con due proprietà: name e 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

Ottimo! sembra solido Ci provo! – mattyd

+0

In questo caso non è sicuro che creare un oggetto Persona speciale abbia qualche vantaggio su un oggetto generico. Immagino che in seguito potresti voler eseguire 'instanceof' su di esso? – jpsimons

+0

@darkporter Beh, è ​​difficile da capire da uno snippet di codice, non è vero? Forse un oggetto Person speciale tornerà utile per ulteriori funzionalità, forse per niente ... – Imp

2

L'oggetto del mondo reale:

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

Fai una matrice per una migliore struttura dei dati:

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

Ordina per Classifica:

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

selezionare per nome:

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

ripristinare la struttura originale dei dati:

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

forEach è bello. È un'estensione di Mozilla o è cross-browser? – jpsimons

+0

['ForEach'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) è disponibile nella maggior parte dei browser e può avere un fallback nei browser più vecchi. – Mohsen

+0

Grazie Mohsen! Mi piace il tuo metodo forEach per riconfigurare l'oggetto corrente – mattyd

Problemi correlati