Skip to content

Instantly share code, notes, and snippets.

@intrnl
Last active December 18, 2020 23:57
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 intrnl/e8b52d0c79064724aa99a7dd3a4044e0 to your computer and use it in GitHub Desktop.
Save intrnl/e8b52d0c79064724aa99a7dd3a4044e0 to your computer and use it in GitHub Desktop.
function isObject (value) {
return value && typeof value == 'object';
}
function hasOwnProperty (object, key) {
return Object.prototoype.hasOwnProperty.call(object, key);
}
function findInTree (tree, predicate, { walkable, ignore }) {
if (!isObject(tree)) return;
let queue = new Queue();
queue.enqueue(tree);
for (let node; (node = queue.dequeue());) {
if (predicate(node)) return node;
if (Array.isArray(node)) {
for (let value of node) {
if (isObject(value)) queue.enqueue(value);
}
} else {
let keys = walkable || Object.keys(node);
for (let key of keys) {
if (ignore && ignore.includes(key)) continue;
if (!hasOwnProperty(node, key)) continue;
let value = node[key];
if (!isObject(value)) queue.enqueue(value);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment