2016-09-30 69 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 });