2016-09-30 3 views
1

Итак, у меня есть массив:Как сортировать двумерный массив на основе первого массива в Javascript

distances = [[Obj1, Obj2, Obj3, Obj4], [15,221,9,2]]; 

Я хочу, чтобы отсортировать двумерный массив на основе второго массива таким образом это должно выглядеть следующим образом:

distances = [[Obj4, Obj3, Obj1, Obj2], [2, 9, 15, 221]]; 

Я знаю, что могу использовать этот метод: How to sort 2 dimensional array by column value?, но, похоже, я не могу адаптировать код.

+0

вы должны предпочесть один массив объектов по нескольким массивам * (один массив в собственность) *, что вы должны держать синхронизацию. 'расстояния = [{obj: Obj1, dist: 15}, {obj: Obj2, dist: 221}, {obj: Obj3, dist: 9}, {obj: Obj4, dist: 2}]' С этим легче справиться и вы избегаете проблем с синхронизацией. – Thomas

ответ

2

var distances = [["Obj1", "Obj2", "Obj3", "Obj4"], [15,221,9,2]]; 
 

 
var NewDistances = []; 
 
for (var i = 0; i < distances[0].length; i++) 
 
    NewDistances[i] = { 
 
    Obj: distances[0][i], 
 
    Key: distances[1][i] 
 
    }; 
 
NewDistances.sort(function(O1, O2) { 
 
    return O1.Key < O2.Key ? -1 : (O1.Key > O2.Key ? 1 : 0); 
 
}); 
 
var Result = [[],[]]; 
 
for (var i = 0; i < NewDistances.length; i++) { 
 
    Result[0][i] = NewDistances[i].Obj; 
 
    Result[1][i] = NewDistances[i].Key; 
 
} 
 

 
console.log(Result);

+0

Я жду, THX для ответа! – nick

+0

ОК, его фиксированный и рабочий – Dakusan

+0

Почему -1? Ответ работает – Dakusan

4

Во-первых, довольно unefficient решением было бы перенести ваш массив в соответствии с макетом решения вы связаны в вашем вопросе.

var temp = []; 
for(var i in distances[0]) 
    temp[i] = ([distances[0][i], distances[1][i]]); 

Затем сделать сортировку и превратить его обратно в его прежней форме:

distances = [[], []]; 
for (var i in temp) { 
    distances[0][i] = temp[i][0]; 
    distances[1][i] = temp[i][1]; 
} 
3

Вы можете использовать временный массив для порядка сортировки и применить это к двум массивам distances.

var distances = [['Obj1', 'Obj2', 'Obj3', 'Obj4'], [15, 221, 9, 2]], 
 
    order = distances[0].map(function (_, i) { return i; }); 
 

 
order.sort(function (a, b) { 
 
    return distances[1][a] - distances[1][b]; 
 
}); 
 

 
distances[0] = order.map(function (i) { return distances[0][i]; }); 
 
distances[1] = order.map(function (i) { return distances[1][i]; }); 
 

 
console.log(distances);

3
var sorted = distances[1].map(function (v, i) { 
    return {v:v,i:i,o:distances[0][i]} }). 
     sort(function (a,b) { return a.v - b.v}); 
distances[0] = sorted.map(function (x) { return x.o }); 
distances[1] = sorted.map(function (x) { return x.v }); 
Смежные вопросы