检查数组是否在javascript中最有效地排序(增加,严格增加,减少,严格减少)

时间:2016-07-05 12:48:17

标签: javascript arrays performance sorting

我知道怎么做(就简单的实施而言),但我想要一种方法来做到这一点"最有效率"和" min。代码量" (对于最小的js库)没有任何其他依赖。

预期的行为和细节(签署可选):

function isSorted(array, sign) {
    // code
}

console.log(isSorted([1,2,2,4]));
// true: default behaviour (non-decreasing or increasing; sign : '>=')

console.log(isSorted([4,3,2,1], '<'));
// true : strictly decreasing

console.log(isSorted([4,3,3,1], '<='));
// true : decreasing

提前致谢。

1 个答案:

答案 0 :(得分:3)

如果返回false,您可以将对象用于比较回调,将Array#every用于短路。

  

如果向thisArg提供了every参数,则会在调用时将其传递给callback,以用作其this值。否则,将传递值undefined以用作其this值。 this最终可观察到的callback值是根据确定函数所见的this的通常规则确定的。

function isSorted(array, sign) {
    var compare = {
        '<': function (a, b) { return a < b; },
        '>': function (a, b) { return a > b; },
        '<=': function (a, b) { return a <= b; },
        '>=': function (a, b) { return a >= b; },
    };
    return array.every(function (a, i, aa) {
        return !i || this(a, aa[i - 1]);
    }, compare[sign] || compare['>=']);
}

console.log(isSorted([1, 2, 2, 4]));           // true default behaviour (non-decreasing or increasing; sign : '>=')
console.log(isSorted([4, 3, 2, 1], '<'));      // true strictly decreasing
console.log(isSorted([4, 3, 3, 1], '<='));     // true decreasing
console.log(isSorted([1, 2, 42, 2, 4]));       // false
console.log(isSorted([4, 3, 42, 2, 1], '<'));  // false
console.log(isSorted([4, 3, 42, 3, 1], '<=')); // false