在 JavaScript 中按第一行对二维数组列进行排序

时间:2021-05-14 22:55:39

标签: javascript sorting multidimensional-array

给定一个如下所示的二维数组:

[['c', 'd', 'b', 'a'],
 ['1', '5', '7', '8'],
 ['3', '7', '4', '9']];

按第一行值对列进行排序的最佳方法是什么:

[['a', 'b', 'c', 'd'],
 ['8', '7', '1', '5'],
 ['9', '4', '3', '7']];

第一行的值应该是唯一的。

3 个答案:

答案 0 :(得分:0)

一种方法是转置矩阵,然后对其进行排序并转回:

let arr =
[['c', 'd', 'b', 'a'],
 ['1', '5', '7', '8'],
 ['3', '7', '4', '9']];

arr = arr[0].map((_, colIndex) => arr.map(row => row[colIndex]));

arr.sort((a,b) => a[0] > b[0]);

arr = arr[0].map((_, colIndex) => arr.map(row => row[colIndex]));

console.log(arr);

答案 1 :(得分:0)

首先,用索引对第一个列数组进行排序。

然后,整个数组及其索引。

const res = [
  ["c", "d", "b", "a"],
  ["1", "5", "7", "8"],
  ["3", "7", "4", "9"],
];
const sort2dArrayColumsByFirstRow = (array) => {
  if (!Array.isArray(array)) return [];
  const sortedFirstRow = res[0]
    .map((item, i) => ({ v: item, i: i }))
    .sort((a, b) => {
      return a.v < b.v ? -1 : 1;
    });
  return array.map((row) => row.map((_, i) => row[sortedFirstRow[i].i]));
};

console.log(sort2dArrayColumsByFirstRow(res));

答案 2 :(得分:-2)

const input = [
  ['c', 'd', 'b', 'a'],
  ['1', '5', '7', '8'],
  ['3', '7', '4', '9']
];

const temp = input[0].map(
  (letter, index) => [letter, input[1][index], input[2][index]]
)

temp.sort(([a], [b]) => a.localeCompare(b))

const result = temp.reduce((acc, cur) => {
  cur.forEach((x, i) => acc[i].push(x));
  return acc;
}, [[],[],[]]) ;

console.log(result)

或者您可以记住对第一个数组进行排序并将其应用于其余数组所遵循的步骤。

const arrayLoop = arr => {
  let i = 0;
  return () => arr[i++ % arr.length]
}

const sortAndRememberSteps = arr => {
  const steps = [];
  arr.sort((a, b) => { const step = a.localeCompare(b); steps.push(step); return step });
  return steps;
}

const input = [
  ['c', 'd', 'b', 'a'],
  ['1', '5', '7', '8'],
  ['3', '7', '4', '9']
];

const [arrayToSort, ...rest] = input

const steps = sortAndRememberSteps(arrayToSort);

rest.forEach(arr => arr.sort(arrayLoop(steps)))

console.log(input)

PS:为什么投反对票?