假设我有一个这样的数组
var arr = [ [1,2,3],[4,5,1]]
如何检查列是否按升序排列? 对于第一列,1 <4返回true,但最后一列返回false,因为3不小于1。
结果应返回返回false的列的数组
答案 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;
}