javascript通过字符串“a.b.c.d”来更新或读取嵌套

2020-08-28  本文已影响0人  闪闪发光lucia

最近遇到一个问题,总的来说就是通过字符串'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));
上一篇 下一篇

猜你喜欢

热点阅读