Skip to content

Instantly share code, notes, and snippets.

@rseon
Created September 26, 2022 11:20
Show Gist options
  • Save rseon/d8ee796f9138b2aaaf9abb9a4c59b7a8 to your computer and use it in GitHub Desktop.
Save rseon/d8ee796f9138b2aaaf9abb9a4c59b7a8 to your computer and use it in GitHub Desktop.
Node script to convert object in URL string
const object2url = require('./object2url')
const testData = {
name: "John",
age: 13,
skills: ['games', 'programming', 'reading', 'singing'],
invests: {
education: [120.3, 50.5],
kids: 70,
optical: {
north: 20.5,
south: 10.70,
west: 6,
east: [7]
},
deeper: {
first: {
landing: 5,
arrayLike: [
{
despite: true,
superb: 'yes',
omg: {
kiss: ['la'],
maybe: {
thiss: {
wont: {
work: 'false'
}
}
}
},
incredible: ['lalolanda', 'raidcall', 'phase', [5], [{waw: '@wesome'}]],
}
]
}
}
}
};
const encoded = object2url(testData)
console.log(encoded)
// outputs: name=John&age=13&skills[0]=games&skills[1]=programming&skills[2]=reading&skills[3]=singing&invests[education][0]=120.3&invests[education][1]=50.5&invests[kids]=70&invests[optical][north]=20.5&invests[optical][south]=10.7&invests[optical][west]=6&invests[optical][east][0]=7&invests[deeper][first][landing]=5&invests[deeper][first][arrayLike][0][despite]=true&invests[deeper][first][arrayLike][0][superb]=yes&invests[deeper][first][arrayLike][0][omg][kiss][0]=la&invests[deeper][first][arrayLike][0][omg][maybe][thiss][wont][work]=false&invests[deeper][first][arrayLike][0][incredible][0]=lalolanda&invests[deeper][first][arrayLike][0][incredible][1]=raidcall&invests[deeper][first][arrayLike][0][incredible][2]=phase&invests[deeper][first][arrayLike][0][incredible][3][0]=5&invests[deeper][first][arrayLike][0][incredible][4][0][waw]=%40wesome
// @credit Máxima Alekz
// @link https://stackoverflow.com/a/65610041
const is = (className, object) => {
return Object.prototype.toString.call(object) === '[object '+ className +']';
}
const DataEncoder = function() {
this.levels = [];
this.actualKey = null;
}
DataEncoder.prototype.__dataEncoding = function(data) {
let uriPart = '';
const levelsSize = this.levels.length;
if (levelsSize) {
uriPart = this.levels[0];
for(let c = 1; c < levelsSize; c++) {
uriPart += '[' + this.levels[c] + ']';
}
}
let finalString = '';
if (is('Object', data)) {
const keys = Object.keys(data);
const l = keys.length;
for(let a = 0; a < l; a++) {
const key = keys[a];
let value = data[key];
this.actualKey = key;
this.levels.push(this.actualKey);
finalString += this.__dataEncoding(value);
}
} else if (is('Array', data)) {
if (!this.actualKey) throw new Error("Directly passed array does not work")
const aSize = data.length;
for (let b = 0; b < aSize; b++) {
let aVal = data[b];
this.levels.push(b);
finalString += this.__dataEncoding(aVal);
}
} else {
finalString += uriPart + '=' + encodeURIComponent(data) + '&';
}
this.levels.pop();
return finalString;
}
DataEncoder.prototype.encode = function(data) {
if (!is('Object', data) || data === {}) return null;
return this.__dataEncoding(data).slice(0, -1).replace(/&amp;/g, "&");
}
module.exports = (data) => new DataEncoder().encode(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment