PHPIN.NET

 找回密码
 立即注册
查看: 1216|回复: 0

[其他] a.b.c转换成对象 {a:{b:{c:{}}}}}或赋值

[复制链接]

469

主题

31

回帖

5525

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5525
发表于 2023-4-5 22:07:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  1. // 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a[0].b[0].c 的值
  2. const objs = {
  3.   a: [
  4.     {
  5.       b: [
  6.         {
  7.           c: ''
  8.         }
  9.       ]
  10.     }
  11.   ],
  12. };
  13. const str = 'a.0.b.0.c';

  14. /**
  15. * @param objs 原始对象
  16. * @param str 路径字符串
  17. * @param value 要修改的值
  18. */
  19. function setValue(objs, str, value) {
  20.   if (typeof str !== 'string') {
  21.     throw new Error(`参数类型错误`)
  22.   };
  23.   str = str.split('.'); // 切割成数组 ['a', '0', 'b', '0', 'c']
  24.   // 取到str数组的倒数第二个
  25.   for(let i = 0; i < str.length - 1; i++) {
  26.     if (objs[str[i]] !== undefined) {
  27.       objs = objs[str[i]];
  28.     } else {
  29.       throw new Error('传入取值路径有误');
  30.     }
  31.   }
  32.   // 那么此时 objs 拿到的就是 objs.a[0].b[0]的值,最后赋值,就修改成功了
  33.   objs[str[str.length - 1]] = value;
  34. }

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


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

  1. // 现在我们有这样一个结构的对象,也就是说,我们要通过 'a.0.b.0.c' 这个字符串来设置 objs.a[0].b[0].c 的值
  2. const objs = {
  3.   a: [
  4.     {
  5.       b: [
  6.         {
  7.           c: '张三'
  8.         }
  9.       ]
  10.     }
  11.   ],
  12. };
  13. const str = 'a.0.b.0.c';

  14. /**
  15. * @param objs 原始对象
  16. * @param str 路径字符串
  17. */
  18. function getValue(objs, str) {
  19.   if (typeof str !== 'string') {
  20.     throw new Error(`参数类型错误`)
  21.   };
  22.   str = str.split('.'); // 切割成数组 ['a', '0', 'b', '0', 'c']
  23.   for(let i = 0; i < str.length; i++) {
  24.     if (objs[str[i]] !== undefined) {
  25.       objs = objs[str[i]];
  26.     } else {
  27.       throw new Error('传入取值路径有误');
  28.     }
  29.   }
  30.   return objs;
  31. }

  32. console.log(getValue(objs, str));
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|PHPIN.NET ( 冀ICP备12000898号-14 )|网站地图

GMT+8, 2024-5-19 16:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表