2010-10-28 2 views
14

Скажем, у меня есть массив: [0,3,4,2,5,1]JavaScript - сортирует массив, основанный на другой массив целых чисел

Что я хочу сделать, это своего рода массив, такие как:

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

так, что порядок соответствует первый массив.

Это будет выход:

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

Есть простой способ сделать это?

+4

Ваш вопрос сбивает с толку, так как она не имеет ничего общего с сортировкой. Вы сохраняете массив в том же порядке, просто сопоставляете каждый элемент массива с элементом другого массива. – Amnon

ответ

16

Вы можете сделать что-то вроде этого:

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.

Примечание: это предполагает, что массивы, которые вы передаете, эквивалентны по размеру, вам нужно будет добавить дополнительные проверки, если это может быть не так.

+0

Спасибо, Ник, это прекрасно работает! –

0

Не сюр, как вы получите свой первый массив, но вы можете использовать массив объектов вместо [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'} 
] 

И избежать его обработать.

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 
*/ 

// Вы можете сделать заказ неиндексированного свойства массива, // и вызов 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

Это Java, но вопрос задает JavaScript. Если вы сделаете этот код psuedo, это может помочь. –

1

меня попросили это на телефонное интервью. Затем сделайте это, не создавая другого массива, предположив, что массив очень большой. Я не знаю, был ли это ответ, потому что я не смог сделать это на вызове (черт!), Но вот что я придумал.

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/

Смежные вопросы