Created
September 26, 2022 11:20
-
-
Save rseon/d8ee796f9138b2aaaf9abb9a4c59b7a8 to your computer and use it in GitHub Desktop.
Node script to convert object in URL string
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
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 |
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
// @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(/&/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