最近遇到一个问题,总的来说就是通过字符串'a.b.c.d'来设置对应对象结构的值,举个🌰
// 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a[0].b[0].c 的值
const objs = {
a: [
{
b: [
{
c: ''
}
]
}
],
};
const str = 'a.0.b.0.c';
/**
* @param objs 原始对象
* @param str 路径字符串
* @param value 要修改的值
*/
function setValue(objs, str, value) {
if (typeof str !== 'string') {
throw new Error(`参数类型错误`)
};
str = str.split('.'); // 切割成数组 ['a', '0', 'b', '0', 'c']
// 取到str数组的倒数第二个
for(let i = 0; i < str.length - 1; i++) {
if (objs[str[i]] !== undefined) {
objs = objs[str[i]];
} else {
throw new Error('传入取值路径有误');
}
}
// 那么此时 objs 拿到的就是 objs.a[0].b[0]的值,最后赋值,就修改成功了
objs[str[str.length - 1]] = value;
}
setValue(objs, str, '李四');
console.log(objs); // 那么到这里,就已经将 objs.a[0].b[0].c 的值修改为 '李四' 了,功能完成
下面我们来说下通过路径字符串去取对象的值,很简单,代码只需做小小的改动
// 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a[0].b[0].c 的值
const objs = {
a: [
{
b: [
{
c: '张三'
}
]
}
],
};
const str = 'a.0.b.0.c';
/**
* @param objs 原始对象
* @param str 路径字符串
*/
function getValue(objs, str) {
if (typeof str !== 'string') {
throw new Error(`参数类型错误`)
};
str = str.split('.'); // 切割成数组 ['a', '0', 'b', '0', 'c']
for(let i = 0; i < str.length; i++) {
if (objs[str[i]] !== undefined) {
objs = objs[str[i]];
} else {
throw new Error('传入取值路径有误');
}
}
return objs;
}
console.log(getValue(objs, str));