【问题标题】:JS multidimentionnal array sort listJS多维数组排序列表
【发布时间】:2017-09-21 05:16:51
【问题描述】:

有了这个数组:

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

【问题讨论】:

  • 您最好将其映射到第一个,而不是在排序后将其转换回第二个。
  • 要记住的一点是,在第一种情况下,您正在对数组 arr 进行排序,而在第二种情况下,您正在对子数组的混搭进行排序,因此 arr.sort 永远不会成功因为您没有尝试对arr 进行排序。正如@epascarello 所说,您最好将一个映射到另一个。
  • 所以,如果我正确理解了这个问题,您将尝试根据 array3 的值对 array1 和 array2 进行排序。这不是简单的实现,我想如果你不想这样做的话,你正在尝试做一些更容易的事情。我可以建议您转置矩阵,使用第一个实现对其进行排序,然后将其转回。或者你可以实现一个非常特殊的排序,但是使用 .sort() 是不可能的。
  • 谢谢您的建议。我已经在基地分配了桌子。看到这样一个充满活力和自愿的社区真是令人着迷。谢谢大家!

标签: javascript arrays sorting multidimensional-array


【解决方案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; }

【讨论】:

    【解决方案2】:

    对于您想要实现的目标,这是一个丑陋的实现,但是,我觉得您使用这种方法过于复杂了一些简单的东西。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 2011-05-20
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多