2017-04-24 47 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); 
再次

,我建议重新考虑你的问题,但如果你确定你需要为这个问题的解决这个复杂的,那么在这里你去:)