json8-pointer
Version:
JSON Pointer toolkit for JavaScript
59 lines (49 loc) • 1.4 kB
JavaScript
;
const join = require("./join");
function each(obj, iterator) {
if (global.Set && obj instanceof Set) {
let c = 0;
obj.forEach(function (value) {
iterator(value, (c += 1));
});
} else if (Array.isArray(obj) || (global.Map && obj instanceof Map)) {
obj.forEach(iterator);
} else if (typeof obj === "object" && obj !== null) {
Object.keys(obj).forEach(function (key) {
iterator(obj[key], key);
});
} else {
throw new TypeError(obj + "is not a structure");
}
}
function _walk(value, key, parent, fn) {
fn(value, key, parent);
if (value === null || typeof value !== "object") return;
each(value, function (v, k) {
_walk(v, k, value, fn);
});
}
module.exports = function walk(json, fn) {
const dic = Object.create(null);
function get(obj) {
for (const p in dic) {
if (dic[p] === obj) return p;
}
}
function set(obj, key, parent) {
const path = join(parent ? get(parent) : parent, key);
dic[path] = obj;
}
_walk(json, undefined, undefined, function (v, k, p) {
if (v !== null && typeof v === "object") {
if (p === undefined || k === undefined) set(v, [], "");
else set(v, k.toString(), p);
}
if (k === undefined || p === undefined) {
fn(v, "");
} else {
const parent = get(p);
fn(v, join(parent, k.toString()), p, parent);
}
});
};