deepGet
Returns the target value in a nested JSON object, based on the keys
array.
Compare the keys you want in the nested JSON object as an Array
.
Use Array.prototype.reduce()
to get value from nested JSON object one by one.
If the key exists in object, return target value, otherwise, return null
.
typescript
// Guard
function isString<T = any>(str: string | T): str is string {
return typeof str === "string";
}
const deepGet = (
obj: any,
keys: string | (string | number)[],
delimiter = "."
) => {
if (isString(keys)) {
keys = keys.split(delimiter);
}
return keys.reduce((xs, x) => (xs && xs[x] ? xs[x] : null), obj);
};
typescript
let index = 2;
const data = {
foo: {
foz: [1, 2, 3],
bar: {
baz: ["a", "b", "c"],
},
},
};
deepGet(data, ["foo", "foz", index]); // 3
deepGet(data, ["foo", "bar", "baz", 8, "foz"]); //undefined
deepGet(data, "foo.foz.2"); // 3
deepGet(data, "foo->foz->2", null, "->"); //3
deepGet(data, "foo.bar.baz.8.foz", null); //null