Ver Mensaje Individual
  #13 (permalink)  
Antiguo 30/05/2014, 18:16
Avatar de Alexis88
Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 6 meses
Puntos: 977
Respuesta: [APORTE] Función range() equivalente a su similar de PHP

Bueno, luego de haber pensado y probado algunas mejoras, aquí está la versión 3.0 de la función range():

Código Javascript:
Ver original
  1. var range = function(start, end, step){
  2.         range.array = range.array || [];
  3.        
  4.         if (typeof start !== typeof end){
  5.             start = !isNaN(Number(start)) && isFinite(Number(start)) ? Number(start) : 0;
  6.             end = !isNaN(Number(end)) && isFinite(Number(end)) ? Number(end) : 0;
  7.         }
  8.  
  9.         if (typeof start === "string")
  10.             start = !isNaN(Number(start)) && isFinite(Number(start)) ? Number(start) : start[0].toLowerCase();
  11.         if (typeof end === "string")
  12.             end = !isNaN(Number(end)) && isFinite(Number(end)) ? Number(end) : end[0].toLowerCase();
  13.  
  14.         range.array.push(start);
  15.  
  16.         if (!isNaN(step) && isFinite(step))
  17.             step = start > end ?
  18.                    Number(step > 0 ? -step || -1 : step || -1) :
  19.                    Number(step < 0 ? -step || 1 : step || 1);
  20.         else
  21.             step = start > end ? -1 : 1;
  22.  
  23.         start = typeof start === "string" ?
  24.                 String.fromCharCode(start.charCodeAt(0) + step) :
  25.                 start += step;
  26.  
  27.         return (step > 0 && start <= end) || (step < 0 && start >= end) ?
  28.                 range(start, end, step) : (function(){
  29.                     var aux = range.array;
  30.                     range.array = [];
  31.                     return aux;
  32.                 })();
  33.     };
  34.  
  35. console.log(range("z", "A"));
  36. console.log(range("Z", "a"));
  37. console.log(range("z", "a"));
  38. console.log(range("a", "Z"));
  39. console.log(range("A", "z"));
  40. console.log(range("a", "z"));
  41. console.log(range("ab", "yz"));
  42. console.log(range(1, 10));
  43. console.log(range(10, 1));
  44. console.log(range(10, 1, 1.5));
  45. console.log(range(1, 10, "-4"));
  46. console.log(range(10, 1, "-4"));
  47. console.log(range(1, 10, "4"));
  48. console.log(range(10, 1, "4"));
  49. console.log(range(10, 1, "a"));
  50. console.log(range(10, 1, -2));
  51. console.log(range(1, 10, 2));
  52. console.log(range("1", 10));
  53. console.log(range(10, "1"));
  54. console.log(range(10, "a"));
  55. console.log(range(1, 10, -2));
  56. console.log(range("a", 10));
  57. console.log(range("1", "10"));
  58. console.log(range("10", "1"));

Los resultados son los siguientes:

Código HTML:
Ver original
  1. z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
  2. z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
  3. z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
  4. a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  5. a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  6. a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
  7. a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y
  8. 1,2,3,4,5,6,7,8,9,10
  9. 10,9,8,7,6,5,4,3,2,1
  10. 10,8.5,7,5.5,4,2.5,1
  11. 1,5,9
  12. 10,6,2
  13. 10,9,8,7,6,5,4,3,2,1
  14. 10,8,6,4,2
  15. 1,3,5,7,9
  16. 1,2,3,4,5,6,7,8,9,10
  17. 10,9,8,7,6,5,4,3,2,1
  18. 10,9,8,7,6,5,4,3,2,1,0
  19. 1,3,5,7,9
  20. 0,1,2,3,4,5,6,7,8,9,10
  21. 1,2,3,4,5,6,7,8,9,10
  22. 10,9,8,7,6,5,4,3,2,1

Mejoras implementadas:
  • Si los tipos de dato de los límites son diferentes, la función toma sus valores numéricos en caso de tenerlos, dígase "4", "100", mas no "a" o "b", caso contrario, se asigna 0 ya sea a start y/o a end.
  • En caso de tener letras como límites y de estar uno de ellos en mayúscula y el otro en minúscula, siempre serán convertidos a minúsculas y se operarán como tales, obteniendo así el valor Unicode correspondiente a la letra en cuestión en minúscula.
  • Siempre toma el valor numérico de step, para así poder dar pasos de, por ejemplo, "-4" o "4", los cuales serán tomados como -4 y 4, respectivamente.
  • Si los límites son cadenas pero con valor numérico, dígase "1" y "10", se toma el valor numérico de ambos.

Cualquier otro aporte o sugerencia, será bienvenido.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 31/05/2014 a las 17:47 Razón: Ejemplos y mejoras