Skip to content

Instantly share code, notes, and snippets.

@albemuth
Forked from leopic/inUrl.js
Last active December 23, 2015 18:49
Show Gist options
  • Save albemuth/6678251 to your computer and use it in GitHub Desktop.
Save albemuth/6678251 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'))
@leopic
Copy link

leopic commented Sep 24, 2013

ah que chuzo, me gusta mucho como cambiaste la estructura, no pense en encadenar el map, buenisimo Alfie, sos un sol!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment