Last active
August 29, 2015 14:19
-
-
Save MrNice/e4379bf4ba2369145e6e to your computer and use it in GitHub Desktop.
QueryString manipulator
This file contains hidden or 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
// Fun to write an understand version | |
var R = require('ramda'); | |
function queryToObject(qString) { | |
// strip ? | |
// split on & | |
// split on = | |
// fromPairs | |
var noQuestionMark = qString.slice(1); | |
var kvArray = noQuestionMark.split('&'); | |
var pairs = R.map(function(string) { return string.split('=') }, kvArray); | |
return R.fromPairs(pairs); | |
// return R.fromPairs( | |
// R.map(function(string) { return string.split('='), | |
// qString.slice(1).split('&')})); | |
} | |
function objectToQuery(obj) { | |
var pairs = R.toPairs(obj); | |
var kvArray = R.map(function(kvArr) { return kvArray.join('=') }, pairs); | |
return '?' + kvArray.join('&'); | |
} | |
function unpackThenRepack(fn, obj) { | |
return objectToQuery(fn(queryToObject(obj))); | |
} | |
function addToQuery(qString, key, value) { | |
var obj = queryToObject(qString); | |
obj[key] = value; | |
return objectToQuery(obj); | |
// Abuse lexical scoping | |
// return unpackThenRepack(function(obj) { | |
// obj[key] = value; | |
// return obj; | |
// }); | |
} | |
function removeFromQuery(qString, key) { | |
var obj = queryToObject(qString); | |
delete obj[key]; | |
return objectToQuery(obj); | |
// return unpackThenRepack(function(obj) { | |
// delete obj[key] | |
// return obj; | |
// }); | |
} | |
function largestKey(qString) { | |
var obj = queryToObject(qString); | |
var keys = R.keys(obj); // Could also use Object.keys as well | |
var sortedKeys = R.sort(function(a, b) { | |
return b.length - a.length; // largest first... I think. | |
}, keys); | |
return R.head(sortedKeys); // head is the same as first | |
// return R.head( | |
// R.sort(function(a, b) { return b.length - a.length }, | |
// R.keys(queryToObject(qString)))); | |
} | |
// shorter names bc they're bound to the module | |
// The larger names show up in stack traces | |
module.exports = { | |
q2Obj: queryToObject, | |
obj2Q: objectToQuery, | |
add: addToQuery, | |
remove: removeFromQuery, | |
largestKey: largestKey | |
}; |
This file contains hidden or 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
var qStringer = require('qString'); | |
var qString = '?key1=val1&key2=val2&key3=val3'; | |
var qString2 = qStringer.add(qString, 'largest', 'this'); | |
// ~ '?key1=val1&key2=val2&key3=val3&largest=this'; | |
var qString3 = qStringer.remove(qString2, 'key2'); | |
// ~ '?key1=val1&key3=val3&largest=this'; | |
var largest = qStringer.largestKey(qString2); | |
// 'largest' |
This file contains hidden or 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
// Pragmatic getter done version | |
function addToQuery(qString, key, value) { | |
return qString + key + '&' + value; | |
} | |
function removeFromQuery(qString, key) { | |
var kvArray = qString.slice(1).split('&'); | |
var filteredArray = kvArray.filter(function(string) { | |
return !(string.indexOf(key + '=') + 1); // JavaScript -1 is truthy D': | |
}); | |
return '?' + filteredArray.join('&'); | |
} | |
function largestKey(qString) { | |
// loop through once, collecting a temp largest key | |
// A key is the space between & and = | |
// return the largest key found | |
var largest = ''; | |
var temp = ''; | |
var char = ''; | |
var addingToggle = true; | |
// i starts at 1 bc qString[0] === ? always | |
for(var i = 1; i < qString.length; i++) { | |
char = qString[i]; | |
if (char === '=') { | |
if (temp.length > largest.length) { | |
largest = temp; | |
} | |
addingToggle = false; | |
} else if (char === '&') { | |
addingToggle = true; | |
} else if (addingToggle) { | |
temp += char; | |
} | |
// Otherwise, skip all values | |
} | |
return largest; | |
} | |
module.exports = { | |
add: addToQuery, | |
remove: removeFromQuery, | |
largestKey: largestKey | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment