2017-04-24 5 views
1

Mit diesem Array:JS multidimentionnal Array sortieren Liste

var arr = []; 
arr[0] = [1, 'Peter', 3]; 
arr[1] = [1, 'Mary', 2]; 
arr[2] = [0, 'David', 5]; 
arr[3] = [0, 'John', 4]; 
arr[4] = [0, 'Billy', 1]; 

Dies funktioniert:

arr.sort(function (a,b) { 
    console.log(a[2]); 

    if (a[2] > b[2]) return 1; 
    if (a[2] < b[2]) return -1; 
    return 0; 
});  

Aber mit einem Array wie folgt:

var arr = []; 
arr[0] = [1, 1, 0, 0, 0]; 
arr[1] = ['Peter', 'Mary', 'David', 'John', 'Billy']; 
arr[2] = [3, 2, 5, 4, 1]; 

A [2] bekommt 0 -David.

Ich gab alles zurück, ich kann es wirklich nicht herausfinden. Bitte, weißt du, wie ich das zweite Array nach arr [2] Liste sortieren könnte?

+3

Sie könnten besser Mapping sein, es zu das erste und dann nach der Sortierung in das zweite zurückkonvertieren. – epascarello

+0

Eine Sache, die Sie beachten sollten, ist, dass Sie im ersten Fall das Array "arr" sortieren und in der zweiten einen Mash der Subarrays sortieren, so dass "arr.sort" niemals den Trick macht, weil Sie es nicht versuchen um 'arr' zu sortieren. Wie @epascarello sagte, werden Sie besser einander zuordnen. –

+1

Also, wenn ich das Problem richtig verstehe, versuchen Sie Array1 und Array2 basierend auf den Werten von Array3 zu sortieren. Dies ist nicht trivial implementiert, und ich nehme an, Sie versuchen, etwas zu tun, das viel einfacher sein kann, wenn Sie es nicht so machen wollten. Ich kann vorschlagen, dass Sie Ihre Matrix transponieren, sortieren Sie es mit der ersten Implementierung, dann transponieren Sie es zurück. Oder Sie können eine ganz spezielle Art implementieren, aber mit der .sort() ist es nicht wirklich möglich. – Alex

Antwort

1

Sie können ein anderes Array mit den Indizes verwenden, diese nach Bedarf sortieren und das Ergebnis dem angegebenen Array zuordnen.

var array = [[1, 1, 0, 0, 0], ['Peter', 'Mary', 'David', 'John', 'Billy'], [3, 2, 5, 4, 1]], 
 
    sortBy = array[2], 
 
    indices = sortBy.map(function (_, i) { return i; }); 
 

 
indices.sort(function (a, b) { return sortBy[a] - sortBy[b]; }); 
 
array = array.map(function (a) { 
 
    return indices.map(function (i) { return a[i]; }); 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Hier ist eine hässliche Implementierung für das, was Sie erreichen wollen, aber ich fühle, dass Sie etwas einfach mit diesem Ansatz sind overcomplexifying.

Ich schlage vor, dass Sie Ihre Matrix transponieren, sortieren Sie es mit Ihrer ersten Implementierung, und transponieren Sie es dann wieder in das ursprüngliche Layout.

var arr = []; 
arr[0] = [1, 1, 0, 0, 0]; 
arr[1] = ['Peter', 'Mary', 'David', 'John', 'Billy']; 
arr[2] = [3, 2, 5, 4, 1]; 

function transpose(array) { 
    return array[0].map(function(col, i) { 
     return array.map(function(row) { 
      return row[i] 
     }) 
    }); 
} 

function twistedSort(matrix, sortingRowIndex) { 
    var transposed = transpose(matrix); 

    transposed.sort(function(a, b) { 
     if (a[sortingRowIndex] > b[sortingRowIndex]) return 1; 
     if (a[sortingRowIndex] < b[sortingRowIndex]) return -1; 
     return 0; 
    }); 

    return transpose(transposed); 
} 

twistedSort(arr, 2); 

Noch einmal, ich schlage vor, zu überdenken Ihr Problem, aber wenn Sie sicher sind, müssen Sie diesen Komplex eine Lösung für dieses Problem, dann hier gehen Sie :)