1.简单版
/** * @param {object} source * @param {string | string[]} path * @param {any} [defaultValue] * @return {any} */ function get(source, path, defaultValue = undefined) { if(typeof object !== 'object') { return defaultValue } if(Array.isArray(path) && !path.length) { return defaultValue } if(typeof path === "string" && !path.trim().length) { return defaultValue } const paths = Array.isArray(path) ? path : path.replace(/[/g, '.').replace(/]/g, '').split('.'); return paths.reduce((cur, pre) => (cur || {})[pre], source) || defaultValue; }
2.完整版
function isDef(target) { return target !== undefined && target !== null; } function nextSplit(key) { const cartfulIndexs = []; const regx = /[(d+)]/g; let wholeKey = key; let matchResult; while ((matchResult = regx.exec(key))) { cartfulIndexs.push(matchResult[1]); } if (cartfulIndexs.length) { wholeKey = wholeKey.substring(0, wholeKey.indexOf(cartfulIndexs[0]) - 1); } return [wholeKey, ...cartfulIndexs]; } export function get(target, keyStrs, defaultValue) { if (!isDef(target)) return defaultValue; const keyParts = keyStrs .split(".") .map(nextSplit) .flat(); let value = target; for (let index = 0; index < keyParts.length; index++) { const key = keyParts[index]; // console.log(key, value); if (isDef(value[key])) { value = value[key]; } else { return defaultValue; } } return value; }