2012-12-04 22 views
5

Ho un oggetto letterale, in cui i valori della sua chiave sono più oggetti, e una delle chiavi degli oggetti interni è denominata "rank" - e ha un valore in virgola mobile. Voglio convertire l'oggetto letterale in una matrice di oggetti interni, ordinati per il valore di "rank".Conversione di un oggetto letterale in una matrice ordinata

all'oggetto ingresso:

{ 
452:{ 
    bla:123, 
    dff:233, 
    rank:2 
    }, 
234:{ 
    bla:123, 
    dff:233, 
    rank:1 
    } 

}

Array uscita:

[ 
{ bla:123, dff:233, rank:1}, 
{ bla:123, dff:233, rank:2 } 
] 
+2

Qualsiasi codice finora :) –

+2

postale po 'di codice, preferibilmente l'oggetto in questione. – adeneo

+1

Abbiamo bisogno di vedere il codice letterale dell'oggetto che si desidera convertire in un array. Mostraci il codice – jfriend00

risposta

7

Esempio:

var data = { 
    foo: { 
     rank: 5 
    }, 
    bar: { 
     rank: 2 
    }, 
    baz: { 
     rank: 8 
    } 
}; 

JavaScript:

var mappedHash = Object.keys(data).sort(function(a, b) { 
    return data[ a ].rank - data[ b ].rank; 
}).map(function(sortedKey) { 
    return data[ sortedKey ]; 
}); 

Ciò avverrebbe prima sort gli oggetti interni nel valore di obj.rank e dopo che map gli oggetti contenenti in un array .

Risultato: [{rank: 2}, {rank: 5}, {rank: 8}]


Riferimento: Object.keys, Array.prototype.sort, Array.prototype.map


Il codice di cui sopra contiene ECMAscript 262 codice edizione 5, che è disponibile in tutti i browser moderni. Se si desidera supportare anche i browser legacy, è necessario includere una delle varie librerie ES5-Shim.

+0

+1 risposta molto bella –

0

iterare su proprietà del vostro oggetto, spingendo gli oggetti interni in un array, e quindi ordinare l'array con una funzione di ordinamento personalizzata:

var inputObject = {}, // your object here 
    arr = []; 

for (var k in inputObject) 
    arr.push(inputObject[k]); 

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

Sto cercando di rispondere all'utente nnnnnn utilizzando il simbolo "@" come indicato nella sezione della guida. Non funziona. Ho avuto questo problema anche in altri post - usando il mio Mac o PC. Semplicemente non appare quando uso il segno "@" prima del nome utente. Dove dovrei pubblicare una domanda come questa? – Chris22

+0

In ogni caso, per nnnnnn, cosa fa 'a.rank - b.rank' nel metodo di ordinamento dell'array? Grazie. – Chris22

+1

@ Chris22 ['.sort()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) consente di passare una funzione che verrà chiamata ogni volta è necessario un confronto tra due elementi dell'array - 'a' e' b' sono i due elementi. La funzione di confronto deve restituire un numero positivo se 'a' deve venire dopo' b' nei risultati ordinati, un numero negativo se 'a' deve precedere' b', e '0' se' a' e 'b' sono uguali per scopi di ordinamento. In questo caso gli elementi sono oggetti che hanno una proprietà numerica 'rank', quindi' a.rank - b.rank' restituisce un valore appropriato. – nnnnnn

Problemi correlati