2016-09-30 42 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

首先,而是效率不高的解決辦法是轉你的陣列,以配合您在您的問題聯繫起來解決方案的佈局。

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 });