2011-02-11 672 views

Respuesta

20

No hay nada fácil de hacer esto a través del navegador. Suponiendo una matriz como

var a = [ 
    {key: "foo", value: 10}, 
    {key: "bar", value: 1}, 
    {key: "baz", value: 5} 
]; 

...se puede obtener una gran variedad de las propiedades key Weaver value de la siguiente manera:

var sorted = a.slice(0).sort(function(a, b) { 
    return a.value - b.value; 
}); 

var keys = []; 
for (var i = 0, len = sorted.length; i < len; ++i) { 
    keys[i] = sorted[i].key; 
} 

// keys is ["bar", "baz", "foo"]; 
+1

Esta no fue la única buena respuesta, pero esta fue la que más se acercó a hacer lo que quería de una manera que podía entender. Eso no quiere decir que sea la mejor respuesta. –

7

Asumamos que tenemos una Array de Objects, como:

var data = [ 
    {foo: 6}, 
    {foo: 2}, 
    {foo: 13}, 
    {foo: 8} 
]; 

podemos llamar Array.prototype.sort()help, utilice Array.prototype.map()help para asignar una nueva matriz y Object.keys()help para agarrar la llave:

var keys = data.sort(function(a,b) { 
    return a.foo - b.foo; 
}).map(function(elem, index, arr) { 
    return Object.keys(elem)[0]; 
}); 

Tenga en cuenta, Array.prototype.map() requiere Javascript 1.6 y Object.keys() es ECMAscript5 (requiere Javascript 1.8.5).

Encontrarás un código alternativo para todos esos métodos en MDC.

+0

Gracias por esto. Cuando intenté ejecutarlo, no me gustó "Object.keys (elem) [0]" ... Intentaré recrear el error más tarde. ¿Qué está haciendo el "Objeto" allí? Perdóname si es una pregunta tonta. –

4

Hasta donde yo sé, no hay una función incorporada de Javascript para ordenar una matriz por sus claves.

Sin embargo, no debería tomar demasiado código para hacerlo: simplemente extraiga las claves en su propia matriz, ordénelas usando la función normal sort, y reconstruya la matriz en el orden correcto. Algo como esto debe hacer el truco:

function SortArrayByKeys(inputarray) { 
    var arraykeys=[]; 
    for(var k in inputarray) {arraykeys.push(k);} 
    arraykeys.sort(); 

    var outputarray=[]; 
    for(var i=0; i<arraykeys.length; i++) { 
     outputarray[arraykeys[i]]=inputarray[arraykeys[i]]; 
    } 
    return outputarray; 
} 

Ahora usted puede simplemente llamar a su función, así:

var myarray = {'eee':12, 'blah':34 'what'=>66, 'spoon':11, 'snarglies':22}; 
myarray = SortArrayByKeys(myarray); 

Y la salida será:

{'blah':34, 'eee':12, 'spoon':11, 'snarglies':22, 'what':66} 

Espero que ayude.

Trabajando página de prueba aquí: http://jsfiddle.net/6Ev3S/

+0

Gracias, pero quiero ordenar por los valores y devolver la clave. –

+0

@David Rhoden - oh, bien ... entonces puedes usar 'array.sort()', seguido de 'for (var key in array) {...}'. – Spudley

1

Si no puede contar con las propiedades de objeto y matriz Exended,

puede utilizar la matriz original de métodos-

function keysbyValue(O){ 
    var A= []; 
    for(var p in O){ 
     if(O.hasOwnProperty(p)) A.push([p, O[p]]); 
    } 
    A.sort(function(a, b){ 
     var a1= a[1], b1= b[1]; 
     return a1-b1; 
    }); 
    for(var i= 0, L= A.length; i<L; i++){ 
     A[i]= A[i][0]; 
    } 
    return A; 
} 
//test 

    var Obj={a: 20, b: 2, c: 100, d: 10, e: -10}; 
    keysbyValue(Obj) 

    /* returned value: (Array) 
    e,b,d,a,c 
    */ 
4

Dada

var object = { 
    'a': 5, 
    'b': 11, 
    'c': 1, 
    'd': 2, 
    'e': 6 
} 

Usted puede ordenar object 's de llaves por sus valores usando la siguiente:

Object.keys(object).sort(function (a, b) { 
    return object[a] - object[b] 
})) 

Resultado

[ 'c', 'd', 'a', 'e', 'b' ] 
Cuestiones relacionadas