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

Gracias quimfv por las observaciones, de hecho esta función es mejorable. Ayer, luego de publicarla, me puse a pensar en las mejoras que se le pueden hacer, pero como estoy avanzando con un proyecto para un cliente, no las pude implementar y de hecho que estaba el tema de que start sea menor que end. ¿De verdad crees que no estás siendo constructivo? Pues opino todo lo contrario.

Hey, Italico76, no había visto tu clase en PHP, está excelente.

Bueno, sin más rodeos, aquí está la versión 2.0 de la función range():

Código Javascript:
Ver original
  1. var range = function(array, start, end, step){
  2.         if (typeof start === typeof end){
  3.             array.push(typeof start === "string" ? start[0] : start);
  4.             step = start > end ?
  5.                    !isNaN(step) && isFinite(step) && step < 0 ? step : -step || -1 :
  6.                    !isNaN(step) && isFinite(step) ? step : 1;
  7.             start = typeof start === "string" ?
  8.                     String.fromCharCode(start.charCodeAt(0) + step) :
  9.                     start += step;
  10.             return (step > 0 && start <= end) || (step < 0 && start >= end) ?
  11.                     range(array, start, end, step) : array;
  12.         }
  13.         return false;
  14.     };
  15.  
  16. console.log(range([], "a", "z"));
  17. console.log(range([], "ab", "yz"));
  18. console.log(range([], 1, 10));
  19. console.log(range([], 10, 1));
  20. console.log(range([], 10, 1, 1.5)); //Toma la parte entera
  21. console.log(range([], 10, 1, "4")); //Toma el 4 como valor numérico, ignorando su tipo
  22. console.log(range([], 10, 1, "a")); //Toma el 1 como valor por defecto, ignorando la "a"
  23. console.log(range([], 10, 1, -2));
  24. console.log(range([], 10, "1"));

Esto imprime lo siguiente:

Código HTML:
Ver original
  1. 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
  2. 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
  3. 1,2,3,4,5,6,7,8,9,10
  4. 10,9,8,7,6,5,4,3,2,1
  5. 10,9,8,7,6,5,4,3,2,1
  6. 10,6,2
  7. 10,9,8,7,6,5,4,3,2,1
  8. 10,8,6,4,2
  9. false

Mejoras implementadas:
  • Opera solo con límites del mismo tipo.
  • En caso de ser letras, solo toma a la primera.
  • Si start es mayor que end, los pasos se dan hacia atrás, creándose una lista en orden descendente.
  • El valor de step tiene que ser numérico (no precisamente el tipo), de lo contrario, se incrementa/decrementa el valor de los pasos de 1 en 1.

Al igual que con la función range() de PHP, si los límites fueran ab hasta yz, solo se toma el primer caracter, tal y como lo pueden comprobar en este ejemplo. Como ahora la función permite la creación de una lista de valores en orden descendente, da igual si step es positivo o negativo.

Cuando termine con mis labores, veré qué más mejoras se pueden hacer, pero si tienen otras, solo díganmelas y las implemento.

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; 30/05/2014 a las 14:53 Razón: Mejora