2010-10-28 26 views
14

Decir que tengo una matriz: [0,3,4,2,5,1]JavaScript - Ordena una matriz basada en otra matriz de enteros

Lo que quiero hacer es ordenar una matriz tales como:

["one", "two", "three", "four", "five", "six"] 

de modo que el orden corresponde a la primera matriz

Esta sería la salida:

["one", "four", "five", "three", "six", "two"] 

¿Hay una manera fácil de lograr esto?

+4

Su pregunta es confusa, ya que no tiene nada que ver con la clasificación. Mantiene la matriz en el mismo orden, simplemente asigne cada elemento de la matriz a un elemento de otra matriz. – Amnon

Respuesta

16

se puede hacer algo como esto:

function getSorted(arr, sortArr) { 
    var result = []; 
    for(var i=0; i<arr.length; i++) { 
    result[i] = arr[sortArr[i]]; 
    } 
    return result; 
} 

You can test it out here.

Nota: suponiendo que las matrices que pasa son de tamaño equivalente, deberá agregar algunas verificaciones adicionales si este no es el caso.

+0

Gracias Nick, ¡esto funciona a la perfección! –

0

No SUR cómo usted consigue su primera matriz, pero se puede usar una gran variedad de objetos en lugar de [0,3,4,2,5,1]:

var arr = [ 
    {n:0, s:'one'}, 
    {n:3, s:'four'}, 
    {n:4, s:'five'}, 
    {n:2, s:'three'}, 
    {n:5, s:'six'}, 
    {n:1, s:'two'} 
] 

y evitar procesarlo.

1
orderedArray= function(arr,order){ 
    return order.map(function(itm){return arr[itm]}); 
} 

var sequence= [0, 3, 4, 2, 5, 1],arr=["one","two","three","four","five","six"] 

arr=new orderedArray(arr,sequence); 

/* returned value: (Array) 
one,four,five,three,six,two 
*/ 

// Se puede realizar el pedido de una propiedad no indexados de la matriz, // y de llamadas array.ordered()

Array.prototype.ordered= function(order){ 
    var arr= this; 
    order=order || this.order; 
    return order.map(function(itm){ 
     return arr[itm]; 
    }); 
} 


var arr= ["one","two","three","four","five","six"], 
sequence= [0, 3, 4, 2, 5, 1]; 

arr.order=sequence; 

arr.ordered() 

/* returned value: (Array) 
one,four,five,three,six,two 
*/ 
-1
class test1 
{ 
    public static String[] sort(int[] array,String[] str) 
    { 
    String[] out=new String[str.length]; 
    for(int i=0;i<str.length;i++) 
    { 
     out[i]=str[array[i]]; 
    } 
    return out; 
    } 
} 
+3

Esto es Java pero la pregunta requiere JavaScript. Si haces este código psuedo, podría ser útil. –

1

me pidieron esto en una entrevista telefónica. Luego hazlo sin crear otra matriz, suponiendo que la matriz es muy grande. No sé si esta es la respuesta, ya que no pude hacerlo en la llamada (maldición!), Pero esto es lo que se me ocurrió.

var my_obj_array = ['a', 'b', 'c', 'd']; 
var my_indicies = [3, 1, 0, 2]; 
// desired result ['d', 'b', 'a', 'c'] 

var temp = {}; 
for (var i = 0; i < my_indicies.length; i++) { 
    temp[i] = my_obj_array[i]; // preserve 
    var j = my_indicies[i]; 
    if (j in temp) { 
     my_obj_array[i] = temp[j]; 
     delete temp[j]; 
    } else { 
     my_obj_array[i] = my_obj_array[j]; 
    } 
} 

http://jsfiddle.net/innerb/RENjW/

Cuestiones relacionadas