import {isArray, isString} from './predicate'; // ------------ @author Daniel de Oliveira ----------------- function makeValueForCurrentKey(resultSegment: any) { return (resultSegment || resultSegment === '' || resultSegment === 0 || resultSegment === false) ? resultSegment : undefined; } const isObject_ = (o: any) => o instanceof Object; // library internal export function getElForPathIn(object: any, path: string): any { if (!path || path.length < 1) return undefined; return _getElForPathIn(object, convertPath(path)); } export function _getElForPathIn(object: any, path: Array): any { const key = path[0]; if (path.length === 1) { if (isString(key)) { if (isObject_(object)) return makeValueForCurrentKey(object[key]); else return undefined; } else { if (isArray(object)) return makeValueForCurrentKey(object[key]); else return undefined; } } else { path.shift(); return object[key] ? _getElForPathIn(object[key], path) : undefined; } } function convertPath(path: string) { const segments = []; let current = ''; for (let i = 0; i < path.length; i++) { if (path[i] !== '[' && path[i] !== '.' && path[i] !== ']') { current += path[i]; } else { if (path[i] === ']') { segments.push(parseInt(current)); } else { if (current) segments.push(current); } current = ''; } } if (current) segments.push(current); return segments; }