You could use Object.keys and check the values. If found, then the actual path is returned and the iteration stops. If not, all possible pathes are checked.
This proposal respects numeric keys off arrays.
function findPath(a, obj) {
function iter(o, p) {
return Object.keys(o).some(function (k) {
result = p.concat(Array.isArray(o) ? +k : k);
return o[k] === a || o[k] && typeof o[k] === 'object' && iter(o[k], result);
});
}
var result;
return iter(obj, []) && result || undefined;
}
var obj = { a: [1, 2, { o: 5 }, 7], b: [0, [{ bb: [0, "str"] }]] };
console.log(findPath(5, obj)); // ["a", 2, "o"]
console.log(findPath("str", obj)); // ["b", 1, 0, "bb", 1]
console.log(findPath(42, obj)); // undefined
.as-console-wrapper { max-height: 100% !important; top: 0; }