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