2011-06-25 9 views
6
real_order = [ '1', '2', '3', '4']; 

friends = [ { name: 'jess', id: '4'}, 
      { name: 'alex', id: '1'}, 
      { name: 'kat', id: '3' }, 
      { name: 'bob', id: '2' } 
      ] 

¿Cómo hago que "friends" array "coincida" con los elementos en real_order? El resultado debería ser:¿Cómo reordenar esta matriz en Javascript en función de otra matriz?

[ 
      { name: 'alex', id: '1'}, 
      { name: 'bob', id: '2' }, 
      { name: 'kat', id: '3' }, 
      { name: 'jess', id: '4'}, 
      ] 

¿Cuál es la solución más eficiente?

Respuesta

5

Aquí hay un código que lo haría:

var i, d = {}, result = []; 
for(i=0; i<friends.length; ++i) 
{ 
    d[friends[i].id] = friends[i]; 
} 

for(i=0; i<real_order.length; ++i) 
{ 
    result.push(d[real_order[i]]); 
} 

Lo que esto hace es que crea un diccionario introducido en cada uno de Identificación de los amigos, a continuación, utiliza la segunda matriz para hacer una mirada hacia arriba y construir el nueva matriz La matriz reordenada resultante se almacena en el resultado.

+0

demasiado rápido, la misma solución que habría tenido proponen – Eineki

0

asegúrese de que real_order es de alcance mundial y esto debe hacerlo:

friends.sort(function(a, b) { 
    if (real_order.indexOf(a.id) > real_order.indexOf(b.id)) { 
     return 1; 
    }else{ 
     return -1; 
    } 
}); 
+0

recuerda por favor dejar un comentario cuando Downvote –

0

Una solución de comandos. Feos como jQuery, pero la gente como John Resig aman este estilo por alguna razón :)

friends.sort(
    (function(order){ 
    return function(a, b) { 
     return order.indexOf(a.id)-order.indexOf(b.id); 
    } 
    })(real_order) 
); 
+0

Estoy bastante seguro de que esto es más eficiente en Javascript –

4

Las matrices se pueden ordenar el uso de su propio algoritmo de ordenación personalizada, por lo que realmente no necesitan real_order. Esta es la forma en que lo haría (edición: Añadido especie delegar para clasificar de forma descendente):

var friends = [ 
      { id:4, name: 'jess'}, 
      { id:1, name: 'alex'}, 
      { id:3, name: 'kat' }, 
      { id:2, name: 'bob' } 
]; 

var order = function(a,b,desc){ 
    return desc ? b.id - a.id : a.id - b.id; 

}, 
orderDesc: function(a,b){return order(a,b,true);}; 

var friendsOrdered = friends.sort(order); 
alert(friendsOrdered[0].name); //=> alex 
alert(friendsOrdered[3].name); //=> jess 

//or sort descending 
var friendsOrdered = friends.sort(orderDesc); 
alert(friendsOrdered[0].name); //=> jess 
alert(friendsOrdered[3].name); //=> alex 
Cuestiones relacionadas