Сортировать массив на основе другого массива целых
Допустим, у меня есть массив: [0,3,4,2,5,1]
.
Что я хочу сделать, это отсортировать массив, например:
["one", "two", "three", "four", "five", "six"]
Так что порядок соответствует первому массиву.
Это будет вывод:
["one", "four", "five", "three", "six", "two"]
Есть ли простой способ сделать это?
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
function getSorted(arr, sortArr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
console.log(sortArr[i], arr[i]);
result[i] = arr[sortArr[i]];
}
return result;
}
var arr = ["one", "two", "three", "four", "five", "six"];
var sortArr = [0, 3, 4, 2, 5, 1];
alert(getSorted(arr, sortArr));
Ответ 2
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
*/
Ответ 3
Меня спросили об этом в телефонном интервью. Затем сделайте это, не создавая другого массива, предположив, что массив очень большой. Я не знаю, является ли это ответом, поскольку я не мог сделать это на вызове (черт!), Но вот что я придумал.
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/
Ответ 4
Не знаю, как вы получаете свой первый массив, но вы можете использовать массив объектов вместо [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'}
]
И избегайте его обработки.
Ответ 5
Вы можете использовать первый массив в качестве каталога для сортировки второго, используя метод map:
const firstArray = [0, 3, 4, 2, 5, 1];
const secondArray = ['one', 'two', 'three', 'four', 'five', 'six'];
const result = firstArray.map((item) => {
return secondArray[item];
});
// result = ["one", "four", "five", "three", "six", "two"]
Ответ 6
let inds = [0,3,4,2,5,1];
let x = ["one", "two", "three", "four", "five", "six"];
let x2 = []; //Output
inds.forEach(ind => x2.push(x[ind]));
x2
//(6) ["one", "four", "five", "three", "six", "two"]
Ответ 7
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;
}
}