admin 发表于 2023-4-5 22:07:10

a.b.c转换成对象 {a:{b:{c:{}}}}}或赋值

最近遇到一个问题,总的来说就是通过字符串'a.b.c.d'来设置对应对象结构的值,举个例子

// 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a.b.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] !== undefined) {
      objs = objs];
    } else {
      throw new Error('传入取值路径有误');
    }
}
// 那么此时 objs 拿到的就是 objs.a.b的值,最后赋值,就修改成功了
objs] = value;
}

setValue(objs, str, '李四');
console.log(objs); // 那么到这里,就已经将 objs.a.b.c 的值修改为 '李四' 了,功能完成

下面我们来说下通过路径字符串去取对象的值,很简单,代码只需做小小的改动

// 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a.b.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] !== undefined) {
      objs = objs];
    } else {
      throw new Error('传入取值路径有误');
    }
}
return objs;
}

console.log(getValue(objs, str));
页: [1]
查看完整版本: a.b.c转换成对象 {a:{b:{c:{}}}}}或赋值