item != ''); let value = obj; for(let i =0; i< ary.length; i++) { value = value[ary[i]]; } console.log(value || defaultVal); } get(obj, 'a.b[0].c', 0); // 输出 1 get(obj, 'a.b.c', 0); // 输出 0"> item != ''); let value = obj; for(let i =0; i< ary.length; i++) { value = value[ary[i]]; } console.log(value || defaultVal); } get(obj, 'a.b[0].c', 0); // 输出 1 get(obj, 'a.b.c', 0); // 输出 0"> item != ''); let value = obj; for(let i =0; i< ary.length; i++) { value = value[ary[i]]; } console.log(value || defaultVal); } get(obj, 'a.b[0].c', 0); // 输出 1 get(obj, 'a.b.c', 0); // 输出 0">
const obj = {
a: {
b: [
{
c: 1,
},
],
},
};
function get(obj, chain, defaultVal) {
let ary = chain.replace(/\\.|\\[|\\]/g,"#").split('#').filter(item=> item != '');
let value = obj;
for(let i =0; i< ary.length; i++) {
value = value[ary[i]];
}
console.log(value || defaultVal);
}
get(obj, 'a.b[0].c', 0); // 输出 1
get(obj, 'a.b.c', 0); // 输出 0
<aside> 💡 未做异常处理,请注意;
</aside>
const getType = (value) =>
Object.prototype.toString
.call(value)
.replace(/^\\[object (\\w+)\\]$/, '$1')
.toLowerCase();
const isObjectLike = (value) => getType(value) === 'object' || getType(value) === 'array';
/**
* @param {object|array} obj
* @param {string} keyPath 同时兼容两种格式'a.b[0].c'和'a.b.0.c'
* @param {any} defaultValue
*/
const lodashGet = (obj, keyPath, defaultValue) => {
if (!isObjectLike(obj)) {
console.error('obj格式有误');
return defaultValue;
}
if (getType(keyPath) !== 'string' || !keyPath) {
console.error('keyPath格式有误');
return defaultValue;
}
const keyArr = keyPath.split('.');
const nextKeyArr = [];
for (let j = 0; j < keyArr.length; j++) {
const item = keyArr[j];
if (~item?.indexOf('[')) {
if (/^[\\W\\w_\\d]*\\[\\d+\\]$/.test(item)) {
const itemMatch = item.match(/([\\W\\w_\\d]*)\\[(\\d+)\\]/);
const key1 = itemMatch[1];
if (key1) {
nextKeyArr.push(key1);
}
const key2 = itemMatch[2];
if (key2) {
nextKeyArr.push(Number(key2));
}
} else {
console.error('keyPath格式有误');
return defaultValue;
}
} else {
nextKeyArr.push(item);
}
}
const len = nextKeyArr.length;
let resValue = obj;
let isError;
for (let i = 0; i < len; i++) {
if (isObjectLike(resValue)) {
resValue = resValue[nextKeyArr[i]];
}
if (!isObjectLike(resValue)) {
if (i < len - 1) {
// 非类对象再取值
console.error('取值有误');
isError = true;
}
break;
}
}
return resValue === undefined || isError ? defaultValue : resValue;
};
const test1 = { a: { b: [{ c: 1 }] }, a1: 22 };
const test2 = [{ c: 1 }];
console.log('test1 格式1', lodashGet(test1, 'a.b[0].c', 'defaultValue'));
console.log('test1 格式2', lodashGet(test1, 'a.b.0.c', 'defaultValue'));