【问题标题】:Sorting columns in a multidimensional Array对多维数组中的列进行排序
【发布时间】:2016-02-17 22:59:47
【问题描述】:

我想使用第一行对多维数组进行排序, 我希望第二行和第三行得到与第一行相同的排序顺序

这是一个数组的例子:

var arr = 
[
[1,3,5,6,0,2],
[1,2,7,4,0,6],
[1,2,3,4,5,6]
]

我想要的结果 =

[
[0,1,2,3,5,6],
[0,1,6,2,7,4],
[5,1,6,2,3,4]
]

我尝试了以下功能,但它没有按我的意愿工作

arr = arr.sort(function(a,b) {
  return a[0] > b[0];
});

我的功能有什么问题? 谢谢

【问题讨论】:

  • 你能发布想要的结果吗?
  • 不清楚列排序的描述是什么意思
  • 另一件事是.sort should return a number,不是布尔值。
  • 那么为什么不使用 [arr[0],arr[0],arr[0]] 创建一个数组会有相同的结果。
  • 我相信 OP 是说如果第一个数组的索引 N 中的项目移动到索引 M,那么索引 N 处的数组 2 和 3 中的任何元素都应该移动到索引 M。

标签: javascript jquery arrays sorting


【解决方案1】:

我想我明白你在寻找什么:

a = [
[1,3,5,6,0,2],
[1,2,7,4,0,6],
[1,2,3,4,5,6]
]

transpose = m => m[0].map((_, c) => m.map(r => r[c]));

z = transpose(transpose(a).sort((x, y) => x[0] - y[0]))

z.map(r => 
    document.write('<pre>'+JSON.stringify(r) + '</pre>'));

在 ES5 中

transpose = function(m) {
    return m[0].map(function (_, c) {
        return m.map(function (r) {
            return r[c]
        })
    })
};

z = transpose(transpose(a).sort(function (x, y) { return x[0] - y[0] }));

UPD:转置技巧有点“聪明”,但效率很低,如果您的矩阵很大,这里有一个更快的方法:

a = [
[1,3,5,6,0,2],
[1,2,7,4,0,6],
[1,2,3,4,5,6]
]

t = a[0].map((e, i) => [e, i]).sort((x, y) => x[0] - y[0]);
z = a.map(r => t.map(x => r[x[1]]));

z.map(r => 
    document.write('<pre>'+JSON.stringify(r) + '</pre>'));

基本上,对第一行进行排序并记住索引,然后为每一行按索引选择值。

【讨论】:

  • 你能把它翻译成英文吗?
  • @MikeC 转置只是翻转矩阵(行变成列,列变成行)
  • 可能缺少箭头功能支持
  • @taboubim:您的平台可能不支持粗箭头功能。将它们替换为普通的functions。
  • @taboubim:添加了 ES5 版本。
【解决方案2】:

比 ES5 中的前一个答案更冗长

var arr = [
   [1, 3, 5, 6, 0, 2],
   [1, 2, 7, 4, 0, 6],
   [1, 2, 3, 4, 5, 6]
 ]
 var sortIndices = arr[0].slice().sort(function(a, b) {
   return a - b;
 }).map(function(el) {
   return arr[0].indexOf(el)
 });

 arr = arr.reduce(function(a, c) {
   var sorted = sortIndices.map(function(i) {
     return c[i];
   });
   a.push(sorted);
   return a;
 }, []);

 document.getElementById('pre').innerHTML = JSON.stringify(arr)
&lt;pre id="pre"&gt;&lt;/pre&gt;

【讨论】:

  • 非常感谢@charlietfl
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 2015-06-28
  • 2010-10-13
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多