繁体   English   中英

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

[英]Sort a 2D array columns by first row in JavaScript

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

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

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

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

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

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

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

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

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

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

 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)

或者您可以记住对第一个数组进行排序并将它们应用于 rest 的步骤。

 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:为什么投反对票?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM