在JavaScript中对2D数组进行排序的简单方法?

piah890a  于 2023-04-19  发布在  Java
关注(0)|答案(5)|浏览(108)

我有一个这样的2D数组:

[[0,23],[19,30],[6,47],[5,59],[1,56],[1,20],[19,10]]

我如何根据pairs的值对它进行排序,像这样:

[[0,23],[1,20],[1,56],[5,59],[6,47],[19,10],[19,30]]

以下是我的尝试:

let arr = [[0,23],[19,30],[6,47],[5,59],[1,56],[1,20],[19,10]];
let result = arr
              .map(a => `${a[0]}.${a[1]}`)
              .sort()
              .map(a => [parseInt(a.split('.')[0]),parseInt(a.split('.')[1])]);
console.log(result);
.as-console-row-code {
  white-space: initial !important;
}

下面的代码仍然给出错误的结果。有什么简单的解决方案吗?

aurhwmvo

aurhwmvo1#

您可以按第一个和第二个索引值的增量进行排序。

const array = [[0, 23], [19, 30], [6, 47], [5, 59], [1, 56], [1, 20], [19, 10]];

array.sort((a, b) => a[0] - b[0] || a[1] - b[1]);

console.log(array);
jmo0nnb3

jmo0nnb32#

let arr = [[0,23],[19,30],[6,47],[5,59],[1,56],[1,20],[19,10]];
let result = arr
             // .map(a => `${a[0]}.${a[1]}`)
              .sort((a,b)=> {
               if (a[0] === b[0]) {
                  return a[1] - b[1];
                } else {
                  return a[0] - b[0];
                } 
              
              })
            //  .map(a => [parseInt(a.split('.')[0]),parseInt(a.split('.')[1])]);
console.log(result);
.as-console-row-code {
  white-space: initial !important;
}

我对map语句做了注解,并没有把它们转换成字符串。这使得它按字典顺序排序。我们可以在这里使用自定义排序函数,如上所示

8hhllhi2

8hhllhi23#

类似于this answer,但适用于任何长度的内部数字数组(不仅仅是2个元素):

function sortByNumberElements(arrA, arrB) {
  let diff = 0;
  const length = Math.min(arrA.length, arrB.length);
  for (let i = 0; i < length; i += 1) {
    diff = arrA[i] - arrB[i];
    if (diff) break;
  }
  return diff;
}

const input = [[0,23],[19,30],[6,47],[5,59],[1,56],[1,20],[19,10]];
input.sort(sortByNumberElements);

const expected = [[0,23],[1,20],[1,56],[5,59],[6,47],[19,10],[19,30]];

console.log("Equal?", JSON.stringify(input) === JSON.stringify(expected));
9lowa7mx

9lowa7mx4#

正确的解决方案是在这里How to sort 2 dimensional array by column value?你可以使用以下代码:

function sort2d(array = [[0,0], [0,0]], order = 1, column = 0) {
    if (order === 1) {
      return array.sort((a, b) => a[column] - b[column])
    }
    if (order === -1) {
      return array.sort((a, b) => b[column] - a[column])
    }
  return array

}

yzuktlbb

yzuktlbb5#

原始问题方法加上解构:

const arr = [[0, 23], [19, 30], [6, 47], [5, 59], [1, 56], [1, 20], [19, 10]];
    
    const result = arr
      .map(([a, b]) => [a, b, a + b / 100])
      .sort(([, , key1], [, , key2]) => key1 - key2)
      .map(([a, b]) => [a, b]);
    
    console.log(result)

相关问题