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 originalvar range = function(array, start, end, step){
if (typeof start === typeof end){
array.push(typeof start === "string" ? start[0] : start);
step = start > end ?
!isNaN(step) && isFinite(step) && step < 0 ? step : -step || -1 :
!isNaN(step) && isFinite(step) ? step : 1;
start = typeof start === "string" ?
String.fromCharCode(start.charCodeAt(0) + step) :
start += step;
return (step > 0 && start <= end) || (step < 0 && start >= end) ?
range(array, start, end, step) : array;
}
return false;
};
console.log(range([], "a", "z"));
console.log(range([], "ab", "yz"));
console.log(range([], 1, 10));
console.log(range([], 10, 1));
console.log(range([], 10, 1, 1.5)); //Toma la parte entera
console.log(range([], 10, 1, "4")); //Toma el 4 como valor numérico, ignorando su tipo
console.log(range([], 10, 1, "a")); //Toma el 1 como valor por defecto, ignorando la "a"
console.log(range([], 10, 1, -2));
console.log(range([], 10, "1"));
Esto imprime lo siguiente:
Código HTML:
Ver originala,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
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
1,2,3,4,5,6,7,8,9,10
10,9,8,7,6,5,4,3,2,1
10,9,8,7,6,5,4,3,2,1
10,6,2
10,9,8,7,6,5,4,3,2,1
10,8,6,4,2
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