2012-06-06 26 views

Respuesta

17

Puede utilizar _.every para comprobar si todos los elementos están en orden:

_.every(arr, function(value, index, array) { 
    // either it is the first element, or otherwise this element should 
    // not be smaller than the previous element. 
    // spec requires string conversion 
    return index === 0 || String(array[index - 1]) <= String(value); 
}); 
+0

hay un tipo que puede manejar los valores 'NaN', luego se puede usar su comparador. – Pointy

+0

@Pointy: estoy leyendo las especificaciones y parece que en el caso de 'NaN', se usa su representación de cadena. No es solo '<=' por desgracia. Voy a editar – pimvdb

+0

Resultó no ser mucho más complicado de hecho. – pimvdb

3

Una solución sencilla sería la de repetir simplemente sobre la lista, examinando si cada elemento es más pequeño que su vecino siguiente:

function is_sorted(arr) { 
    var len = arr.length - 1; 
    for(var i = 0; i < len; ++i) { 
     if(arr[i] > arr[i+1]) { 
      return false; 
     } 
    } 
    return true; 
} 
2
var last = undefined, 
    sorted = true; 
_.forEach(arr, function(val) { 
    if(last !== undefined && val < last) sorted = false; 
    last = val; 
}); 
alert(sorted); 
2

Encontré esto muy útil link.

/* 
* check the array is sorted 
* return: if sorted in ascending -> 1 
*   if sorted in descending -> -1 
*   not sorted -> 0 
*/ 

Array.prototype.isSorted = function() { 
    return (function(direction) { 
    return this.reduce(function(prev, next, i, arr) { 
    if (direction === undefined) 
     return (direction = prev <= next ? 1 : -1) || true; 
    else 
     return (direction + 1 ? 
     (arr[i-1] <= next) : 
     (arr[i-1] > next)); 
    }) ? Number(direction) : false; 
    }).call(this); 
} 

var arr = [3,2,1,0]; 
arr.isSorted(); // Will return -1 
0

He encontrado la solución en JS puro con cada :

//Array is sorted 
 
[1, 2, 3].every((item, i, arr) => i < arr.length - 1 ? arr[i] < arr[i + 1] : arr[i]); //true 
 
[3, 2, 1].every((item, i, arr) => i < arr.length - 1 ? arr[i] < arr[i + 1] : arr[i]); //false 
 

 
//Equolent 
 
[1, 2, 3].every((item, i, arr) => i > 0 ? arr[i] > arr[i - 1] : arr[i] < arr[i + 1]); //true

Cuestiones relacionadas