xref: /expo/packages/@expo/cli/src/utils/obj.ts (revision 8a424beb)
18d307f52SEvan Bacon/** `lodash.get` */
28d307f52SEvan Baconexport function get(obj: any, key: string): any | null {
38d307f52SEvan Bacon  const branches = key.split('.');
48d307f52SEvan Bacon  let current: any = obj;
529975bfdSEvan Bacon  let branch: string | undefined;
68d307f52SEvan Bacon  while ((branch = branches.shift())) {
78d307f52SEvan Bacon    if (!(branch in current)) {
88d307f52SEvan Bacon      return null;
98d307f52SEvan Bacon    }
108d307f52SEvan Bacon    current = current[branch];
118d307f52SEvan Bacon  }
128d307f52SEvan Bacon  return current;
138d307f52SEvan Bacon}
148d307f52SEvan Bacon
158d307f52SEvan Bacon/** `lodash.set` */
168d307f52SEvan Baconexport function set(obj: any, key: string, value: any): any | null {
178d307f52SEvan Bacon  const branches = key.split('.');
188d307f52SEvan Bacon  let current: any = obj;
1929975bfdSEvan Bacon  let branch: string | undefined;
208d307f52SEvan Bacon  while ((branch = branches.shift())) {
218d307f52SEvan Bacon    if (branches.length === 0) {
228d307f52SEvan Bacon      current[branch] = value;
238d307f52SEvan Bacon      return obj;
248d307f52SEvan Bacon    }
258d307f52SEvan Bacon
268d307f52SEvan Bacon    if (!(branch in current)) {
278d307f52SEvan Bacon      current[branch] = {};
288d307f52SEvan Bacon    }
298d307f52SEvan Bacon
308d307f52SEvan Bacon    current = current[branch];
318d307f52SEvan Bacon  }
328d307f52SEvan Bacon  return null;
338d307f52SEvan Bacon}
348d307f52SEvan Bacon
358d307f52SEvan Bacon/** `lodash.pickBy` */
368d307f52SEvan Baconexport function pickBy<T>(
378d307f52SEvan Bacon  obj: { [key: string]: T },
388d307f52SEvan Bacon  predicate: (value: T, key: string) => boolean | undefined
398d307f52SEvan Bacon) {
40*8a424bebSJames Ide  return Object.entries(obj).reduce(
41*8a424bebSJames Ide    (acc, [key, value]) => {
428d307f52SEvan Bacon      if (predicate(value, key)) {
438d307f52SEvan Bacon        acc[key] = value;
448d307f52SEvan Bacon      }
458d307f52SEvan Bacon      return acc;
46*8a424bebSJames Ide    },
47*8a424bebSJames Ide    {} as { [key: string]: T }
48*8a424bebSJames Ide  );
498d307f52SEvan Bacon}
50