JS multidimentionnal数组排序列表

时间:2017-04-24 13:31:46

标签: javascript arrays sorting multidimensional-array

使用此数组:

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]列表对第二个数组进行排序吗?

2 个答案:

答案 0 :(得分:1)

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

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分: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);

再一次,我建议重新考虑你的问题,但如果你确定你需要这个问题的复杂解决方案,那么你去吧:)