Skip to content

Instantly share code, notes, and snippets.

@carlhannes
Last active February 23, 2022 12:53
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 carlhannes/4af8749d8bded1ea0d17252f36103a80 to your computer and use it in GitHub Desktop.
Save carlhannes/4af8749d8bded1ea0d17252f36103a80 to your computer and use it in GitHub Desktop.
JSON Path Resolver in JavaScript
/**
* 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