在JS中检查数组 - 列表是否排序?

Ник*_*тев 16 javascript arrays sorting

我需要创建一个程序来检查数组中的列表是否已排序.我有三个输入数据:

1,2,3,4,5

1,2,8,9,9

1,2,2,3,2

所以这是我的代码:

let sorts = +gets(); // 3
let list = [];

for (let i = 0; i < sorts; i++) {
    list[i] = gets().split(',').map(Number); // The Array will be: [ [ 1, 2, 3, 4, 5 ], [ 1, 2, 8, 9, 9 ], [ 1, 2, 2, 3, 2 ] ]
}

for (let i = 0; i < list[i][i].length; i++){
    if (list[i][i] < list[i][i +1]) {
        print('true');
    } else {
        print('false');
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要打印新行上的所有列表true或false.对于此示例,我的输出必须是:

真正

真正

我不知道如何解决这个问题.

Stu*_*art 19

这样的事情怎么样:

!![1,2,3,4,5].reduce((n, item) => n !== false && item >= n && item)
// true

!![1,2,8,9,9].reduce((n, item) => n !== false && item >= n && item)
// true 

!![1,2,2,3,2].reduce((n, item) => n !== false && item >= n && item)
// false
Run Code Online (Sandbox Code Playgroud)

Reduce将字面上减少到单个值 - 在我们的例子中是一个布尔值.

在这里,我们每次迭代调用一个函数(n, item),它是我们的函数签名,它是正文n !== false && item >- n && item- 我们确保n存在(n是我们的累加器 - 读取!),测试是否item大于n,并确保item存在.

对阵列中的每个元素都会发生这种情况.然后我们使用!!强制结果为tru布尔值.

  • 这是一个聪明的,虽然值得给用户一个解释,没有经验的程序员永远不会明白这里发生了什么.为了测试,这里有一个小提琴:http://jsfiddle.net/briosheje/46r1jm03/ (6认同)
  • 确实.`[0,1,2,3,4,5]`将返回`false`. (4认同)
  • @VisioN这确实是一个非常好的观点. (2认同)
  • 这会短路吗? (2认同)
  • @BobBrinks 不。即使前两个元素没有排序,它也会继续处理 1,000,000 个元素的列表。`arr.every` 有我的投票。 (2认同)

Has*_*mam 16

您可以使用array#every检查每个值是否大于先前的值.

const isSorted = arr => arr.every((v,i,a) => !i || a[i-1] <= v);
console.log(isSorted([1,2,3,4,5]));
console.log(isSorted([1,2,8,9,9])); 
console.log(isSorted([1,2,2,3,2]));
Run Code Online (Sandbox Code Playgroud)

  • @JollyJoker 我不会称之为技巧——它相当于`i === 0`(它可能更具可读性)。这是线程上的最佳解决方案,因为它将早期救助与现代功能语法相结合。 (2认同)

Ram*_*ran 10

只需通过使用slice方法尝试这种方式 :它将检查前一个元素是否小于下一个元素.如果每个元素的条件为真,那么它将返回true,否则为false

arr.slice(1).every((item, i) => arr[i] <= item);
Run Code Online (Sandbox Code Playgroud)

请在下面查看以下示例作为演示

var arr = [[1,2,3,4,5],[1,2,8,9,9],[1,2,2,3,2],[0,1,2,3,4,5]];

function isArrayIsSorted (arr) {
  return arr.slice(1).every((item, i) => arr[i] <= item)
}

var result= [];
for (var i = 0; i < arr.length; i++){
result.push(isArrayIsSorted(arr[i]))
}
console.log(result);
Run Code Online (Sandbox Code Playgroud)

  • 这是非常整洁,有一个upvote :) (3认同)

Jin*_*Jin 5

var str = ["1,2,3,4,5", "1,2,8,9,9", "1,2,2,3,2"];

for (var i in str){
    var list = str[i].split(',').map(Number);
    console.log(list);
    var isSorted = true;
    for(var j = 0 ; j < list.length - 1 ; j++){
        if(list[j] > list[j+1]) {
            isSorted = false;
            break;
        }
    }
    console.log(isSorted);
}
Run Code Online (Sandbox Code Playgroud)


zer*_*0ne 5

排序号码列表

包括负数、零和相邻的重复项

every()如果所有数字都是有序的,则使用将返回 true 的方法,否则将返回 false。条件如下:

(num <= arr[idx + 1]) || (idx === arr.length - 1)
Run Code Online (Sandbox Code Playgroud)
  1. 如果当前数字小于或等于下一个数字...

    或者...

  2. 如果当前索引等于最后一个索引...

     return 1 (truthy)
    
    Run Code Online (Sandbox Code Playgroud)

演示

(num <= arr[idx + 1]) || (idx === arr.length - 1)
Run Code Online (Sandbox Code Playgroud)