核心方法:
function getProperty(obj, keyStr){
// let reg=new RegExp(/\[(\w+)\]/g);
// keyStr = keyStr.replace(reg, '.$1');
keyStr = keyStr.replace(/\[(\w+)\]/g, '.$1');
let keyArray = keyStr.split(".");
for (let i in keyArray) {
obj = obj[keyArray[i]] || null;
}
return obj;
}
调用:
let obj = {
a: {
b: {
c: '12345',
d: [{name: '孙红雷',
'/e-f$_*g/': (name) => name + ':\n这瓜保熟吗?',
h: (param) => param}]
}
}
};
let temp =getProperty(obj, 'a.b.d.0./e-f$_*g/');
let temp1=getProperty(obj, 'a.b.d[0].h');
console.log(temp(temp1('阿强')));
结果:
阿强:
这瓜保熟吗?
function setProperty(obj, keyStr, value) {
// 将路径字符串转换成数组
let keyArray = keyStr.split('.').reduce((acc, curr) => {
let match = curr.match(/\[(\w+)\]/);
if (match) {
acc.push(match[1]);
} else {
acc.push(curr);
}
return acc;
}, []);
// 遍历键数组并创建路径
let current = obj;
for (let i = 0; i < keyArray.length - 1; i++) {
let key = keyArray[i];
if (!current[key]) {
current[key] = {};
}
current = current[key];
}
// 设置最后一个键的值
current[keyArray[keyArray.length - 1]] = value;
}
// 示例用法
let data = {};
setProperty(data, 'a.b.c', 123);
console.log(data); // 输出: { a: { b: { c: 123 } } }
setProperty(data, 'x[0].y', 456);
console.log(data); // 输出: { a: { b: { c: 123 } }, x: [ { y: 456 } ] }