侧边栏壁纸
博主头像
lac博主等级

行动起来,活在当下

  • 累计撰写 66 篇文章
  • 累计创建 12 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

一种简化JavaScript对象多个属性赋值的方式

Hude
2023-03-25 / 0 评论 / 0 点赞 / 50 阅读 / 2505 字

一种简化JavaScript多个对象赋值的方式

问题是怎么出现的?

最近在写一个表单功能,表单中有一项协议选择,需求是通过选择不同协议来控制表单其他项的v-if,由于表单权限设计的数据类型为对象,因此通过权限对象的属性来操作,但是在写的过程中,发现属性比较多,每次选中一个协议,就要给权限对象初始化属性,然后再进行表单项控制

// 表单项权限属性
const formAuth: any = reactive({
    name: true,
    address: true,
    ip: true,
    port: true,
    bps: true,
    rs: true,
    protocols: true,
    compliant: true,
    videoStream: true,
    streamAddress: true,
    restVideo: true,
  });
// 匹配方式
 if (value === 'Pelco P' || value === 'Pelco D') {
      formAuth.name = true;
      formAuth.address = true;
      formAuth.ip = false;
      formAuth.port = false;
      formAuth.bps = false;
      formAuth.rs = false;
      formAuth.protocols = true;
      formAuth.compliant = false;
      formAuth.videoStream = true;
      formAuth.streamAddress = true;
      formAuth.restVideo = false;
    }

问题出现:属性值过多的时候,操作代码异常冗余,不便于维护

这样写的好处是直观,但是表单项增加时,代码会产生冗余,并且这样的增长不是单增长,复杂度=表单项多少+协议多少,后续的维护也相当复杂,要更改好几处地方,因此急需解决!!

解决问题:解决冗余的方式通过两个方面解决:1.对象属性遍历初始化;2.针对不同表单项显示项与未显示项的大小比对,操作比较小的一方

1.简化对象的初始化操作

每个协议选择后,为保证数据没有错误性,要先对数据进行初始化操作,这个过程本身是一个机械的重复的过程,因此可以通过遍历对象属性来操作,相比较第一种处理方式,简化了大量代码

 if (value === 'VISCA') {
      Object.keys(formAuth).forEach((item) => {
        formAuth[item] = true;
      });
      formAuth.ip = false;
      formAuth.port = false;
}

2.比对表单项显示与未显示大小

当选择某个协议后,这个协议所需要显示表单项如果小于表单项的总数,那可以初始化时对协议进行all false,然后对需要显示的属性再进行true显示操作

// 显示的表单项多于总量的一半,初始化所有项为true,再对不显示的项操作false隐藏
if (value === 'VISCA') {
      Object.keys(formAuth).forEach((item) => {
        formAuth[item] = true;
      });
      formAuth.ip = false;
      formAuth.port = false;
}
// 显示的表单项少于于总量的一半,初始化所有项为true,再对显示的项操作true显示
 if (value === 'Pelco P' || value === 'Pelco D') {
      Object.keys(formAuth).forEach((item) => {
        formAuth[item] = false;
      });
      formAuth.name = true;
      formAuth.address = true;
      formAuth.protocols = true;
      formAuth.videoStream = true;
      formAuth.streamAddress = true;
  }
0

评论区