JS多维阵列排序列表



使用此数组:

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-david。

我返回了一切,我真的无法弄清楚。请,您知道我如何根据ARR [2]列表对第二个数组进行排序?

您可以在索引上使用另一个数组,根据需要对它们进行排序,然后将结果映射到给定的数组。

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

这是您想要实现的丑陋实现,但是,我觉得您已经过度复杂化了这种方法。

我建议您转置矩阵,用第一个实现对其进行排序,然后将其转回原始布局。

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

再次,我建议重新思考您的问题,但是如果您确定需要解决此问题的解决方案,那么您就可以:(

最新更新