Skip to content

Instantly share code, notes, and snippets.

@leopic
Forked from albemuth/inUrl.js
Created September 24, 2013 04:53
Show Gist options
  • Save leopic/6680523 to your computer and use it in GitHub Desktop.
Save leopic/6680523 to your computer and use it in GitHub Desktop.
_.mixin({
inUrlDry: function(singleParam) {
//en vez de usar un arreglo para manegar los keys, vals se crea un map, así
//se puede accesar directamente en vez de tener que buscar con index of,
//esa parte pasa de O(n) a O(1) primero se hace un arreglo que tiene una
//estructura así: [[param, {decodedValue: 'val', rawValue: 'val'}]...] y el
//metodo _.object pasa de eso a
//{param: {decodedValue: 'val', rawValue: 'val'}}
var paramMap = _.chain(location.search.slice(1).split('&'))
.map(function(currentParam) {
// en el original se calculaba este split 3 veces, no se va a notar la
// diferencia de performance, pero es buena practica guardar el valor
// calculado, como cuando se cachea un obj jquery, además ayuda a
// mantener las varas DRY
var keyValArr = currentParam.split('=');
return [
keyValArr[0],
{
decodedValue: keyValArr[1].replace(/\+/g,' '),
rawValue: keyValArr[1]
}
]
})
.object()
.value();
/*
* este cambio lo hice para el caso donde tenes algo como
*
* _.inUrl(param);
*
* Entonces si param es falsy, devolvería el objecto con todas las llaves,
* cuando en realidad queremos que devualva false (creo que esa es la idea)
*/
if (arguments.length === 0) {
return paramMap;
}
if (_.has(paramMap, singleParam)) {
return paramMap[singleParam].decodedValue;
}
return false;
}
});
console.log(_.inUrlDry())
console.log(_.inUrlDry('lol'))
//Otro problema on la version original y con inUrlDry es que cada vez que
//llamás a la función se recalcula el objecto de [ key, val ], entonces a menos
//que se esté modificando la vara con el history api siempre va a devolver lo
//mismo, entonces se puede optimizar así
_.mixin({
inUrlFast: (function() {
var paramMap = _.chain(location.search.slice(1).split('&'))
.map(function(currentParam) {
var keyValArr = currentParam.split('=');
return [
keyValArr[0],
{
decodedValue: keyValArr[1].replace(/\+/g,' '),
rawValue: keyValArr[1]
}
]
})
.object()
.value();
// Así paramMap se calcula una sola vez y queda accesible para el mixin
return function(singleParam) {
if (arguments.length === 0) {
return paramMap;
}
if (_.has(paramMap, singleParam)) {
return paramMap[singleParam].decodedValue;
}
return false;
}
})()
});
console.log(_.inUrlFast())
console.log(_.inUrlFast('lol'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment