2017-04-24 46 views
1

有了這個數組:JS multidimentionnal數組排序列表

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]; 

這工作得很好:

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

但是像這樣的數組:

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]獲取0 -大衛。

我返回了一切,我真的搞不清楚。 請問,你知道我可以按照arr [2]列表排序第二個數組嗎?

+3

你可能會更好過映射第一個,並在排序後將其轉換回第二個。 – epascarello

+0

有一點需要注意的是,在第一種情況下,您正在對數組「arr」進行排序,而在第二種情況下,您正在對子數組的排序進行排序,所以'arr.sort'永遠不會做到這一點,因爲您並不試圖排序'arr'。正如@epascarello所說,你會更好地將一個映射到另一個。 –

+1

所以,如果我正確地理解了這個問題,你正在嘗試根據array3的值對array1和array2進行排序。這並不是簡單的實現,如果你不想這樣做,我想你會嘗試做一些更容易的事情。 我可以建議你轉置你的矩陣,將它與第一個實現進行排序,然後將其轉置回來。或者你可以實現一個非常特殊的排序,但通過使用.sort(),這是不可能的。 – Alex

回答

1

您可以使用另一個具有索引的數組,並根據需要對它們進行排序並將結果映射到給定的數組。

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

這裏是一個醜陋的實施要達到什麼樣的,但是,我覺得,你overcomplexifying簡單的東西用這種方法。

我的建議是轉置矩陣,將它與第一個實現進行排序,然後將其轉置回原始佈局。

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); 
再次

,我建議重新考慮你的問題,但如果你確定你需要爲這個問題的解決這個複雜的,那麼在這裏你去:)