Last active
February 23, 2022 12:53
-
-
Save carlhannes/4af8749d8bded1ea0d17252f36103a80 to your computer and use it in GitHub Desktop.
JSON Path Resolver in JavaScript
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
/** | |
* Resolves the value at the given JSON path | |
* | |
* @param {String} path Path with / for children | |
* @param {Object} obj Object to use when searching | |
* @return {Object} Result at the end of the path | |
* | |
* @example | |
* let path = "/path/to/paradise"; | |
* let obj = { | |
* path: { | |
* to: { paradise: "heaven"}, | |
* from: {...} | |
* } | |
* }; | |
* resolveJSONPath( path, obj ); // "heaven" | |
*/ | |
export default function resolveJSONPath(path, obj) { | |
if (path.charAt(0) === '/') { | |
path = path.substring(1); | |
} | |
const arr = path.split('/'); | |
let subpath; | |
let container = obj; | |
for (let i = 0; i < arr.length; i++) { | |
if (arr[i] === '*' && Array.isArray(container)) { | |
const carr = []; | |
subpath = arr.slice(i + 1).join('/'); | |
for (let c = 0; c < container.length; c++) { | |
let v = resolve(subpath, container[c]); | |
if (Array.isArray(v)) { | |
carr.push(...v); | |
} else { | |
carr.push(v); | |
} | |
} | |
return carr; | |
} | |
if (!arr[i] && Array.isArray(container)) { | |
const carr = new Array(container.length); | |
subpath = arr.slice(i + 1).join('/'); | |
for (let c = 0; c < container.length; c++) { | |
carr[c] = resolve(subpath, container[c]); | |
} | |
return carr; | |
} | |
if (arr[i] in container) { | |
container = container[arr[i]]; | |
} | |
} | |
return container; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment