Skip to content

Instantly share code, notes, and snippets.

@MrNice
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MrNice/e4379bf4ba2369145e6e to your computer and use it in GitHub Desktop.
Save MrNice/e4379bf4ba2369145e6e to your computer and use it in GitHub Desktop.
QueryString manipulator
// 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
};
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'
// 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