检查JavaScript 2D数组是否按升序排列?

时间:2019-03-29 16:02:29

标签: javascript

假设我有一个这样的数组

var arr = [ [1,2,3],[4,5,1]]

如何检查列是否按升序排列? 对于第一列,1 <4返回true,但最后一列返回false,因为3不小于1。

结果应返回返回false的列的数组

3 个答案:

答案 0 :(得分:0)

我将通过首先转置矩阵(这是因为它更易于在js中处理),然后映射到每一列(使用Array#every将它们从一组数字转换为布尔值)来实现。

const arr = [ 
  [1,2,3],
  [4,5,1]
];

const transpose = (arr) => Array(arr[0].length)
  .fill(0)
  .map((_, colIndex) => {
    return Array(arr.length)
      .fill(0)
      .map((_, rowIndex) => {
        return arr[rowIndex][colIndex];
      });
  });

const arr2 = transpose(arr);

const arr3 = arr2.map(col => {
  let previousValue = -Infinity;
  return col.every(v => {
    const tmp = previousValue < v;
    previousValue = v;
    return tmp;
  });
});

console.log(arr);
console.log(arr2);
console.log(arr3);

答案 1 :(得分:0)

一个可能的解决方案是在第一个内部数组上使用Array.map(),然后检查是否在特定列上使用Array.some()排序不正确:

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

let res = arr[0].map((n, cIdx) =>
{
    return !arr.some((inner, rIdx) => rIdx > 0 && inner[cIdx] < arr[rIdx - 1][cIdx]);
});

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

答案 2 :(得分:0)

要使用降序查找两个值的“列”,可以使用并行数组。这是该代码的简洁版本。 (第二个片段更加详细,并提供了进一步的解释。)

    var arr = [ [1,2,3], [4,5,1] ], result = [];
    arr[0].forEach((n, i) => { // n is the number, i is the index
      if(arr[0][i] > arr[1][i]){ result.push(i); } // if descending, remember this index
    });
    console.log(result); // Logs `[2]` (an array with the index of the third column)

如果要更改值所在的“列”以使它们按升序排列,则可以这样进行。找到“放错位置”的值时,请将其存储在临时变量中以腾出空间。然后,您可以将这两个值分配给它们的“正确”位置。

const bigArr = [ [1,2,3], [4,5,1] ],
      a1 = bigArr[0],
      a2 = bigArr[1],
      resultArr = [],
      len = Math.min(a1.length, a2.length); // Uses min in case they have different lengths
for(let i = 0; i < len; i++){
  if(a1[i] > a2[i]){ // Checks each position, and exchanges values if necessary
    exchangeValuesInParallelArrays(a1, a2, i);
    resultArr.push(i); // Adds this index to the results array
  }
}
console.log(bigArr); // Logs `[ [1,2,1], [4,5,3] ]`
console.log(resultArr) // Logs `[2]`


function exchangeValuesInParallelArrays(arr1, arr2, index){
  let tempStorage = arr1[index];
  arr1[index] = arr2[index];
  arr2[index] = tempStorage;
}