-
-
Save leopic/6680523 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
_.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