• js根据预设条件定义数组元素


    前言

    开发中,遇到过这样的情况,重用程度较高的组件的数组属性,在不同的重用的场景下,需增减一些元素

    一、示例

    let compId // 组件标识:'comp1', 'comp2', 'comp3'...
    let arr = [
      { label: 'Name', prop: 'name' },
      { label: 'Age', prop: 'age' },         // 组件3中移除
      { label: 'Gender', prop: 'gender' },
      { label: 'Tel', prop: 'tel' },         // 组件1、组件2中显示
      { label: 'Address', prop: 'address' }  // 组件1、组件2中显示
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当上例中的需求不多时,直接操作数组即可。但此类需求很多时,代码可能变得臃肿、可读性差、难以维护。

    例如,假设组件3、组件4需要在 Gender 后插入一条数据,但因为组件3中不显示 Age ,导致如果先处理 Age 这条数据(移除),其插入的 index 分别为 2、3,否则为 3。当然,可以先获取 Genderindex,再插入。此类逻辑一多,这工作量,没人能忍得了。这样的代码能让你舒心吗?需求经常变的话,能轻松跟进吗?

    二、解决方案

    不另写手动插入/移除数据的代码,将所有元素都放在数组中,根据预设条件生成元素

    1、立即执行函数 & 数组解构

    let compId
    let arr = [
      { label: 'Name', prop: 'name' },
      // 组件3中移除Gender
      ...(() => 
        return compId !== 'comp3' ? [{ label: 'Age', prop: 'age' }] : []
      })(),
      { label: 'Gender', prop: 'gender' },
      // 组件1、组件2中显示Tel、Address
      ...(() => 
        return ['comp1','comp2'].includes(compId) ? [
          { label: 'Tel', prop: 'tel' },
          { label: 'Address', prop: 'address' }
        ] : []
      })()
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    有点丑,好在可以简化下。既然返回的是一个表达式,那直接用圆括号取代:

    let compId
    let arr = [
      { label: 'Name', prop: 'name' },
      // 组件3中移除Gender
      ...(compId !== 'comp3' ? [{ label: 'Age', prop: 'age' }] : []),
      { label: 'Gender', prop: 'gender' },
      // 组件1、组件2中显示Tel、Address
      ...(['comp1','comp2'].includes(compId) ? [
        { label: 'Tel', prop: 'tel' },
        { label: 'Address', prop: 'address' }
      ] : [])
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2、判断 & 结果筛选

    数组解构的好处是不产生空值,那如果过滤下结果,也可不用解构。三元运算符或短路运算符均可

    let compId
    let arr = [
      { label: 'Name', prop: 'name' },
      // 组件3中移除Gender
      compId !== 'comp3' && { label: 'Age', prop: 'age' },
      { label: 'Gender', prop: 'gender' },
      // 组件1、组件2中显示Tel、Address
      ['comp1','comp2'].includes(compId) && { label: 'Tel', prop: 'tel' },
      ['comp1','comp2'].includes(compId) && { label: 'Address', prop: 'address' }
    ].filter(Boolean)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这种写法在针对单个元素时会更简洁一些,这两种方法可以取其一,也可结合使用

    总结

    期待更简洁的方案,感觉不够直观,但至少它的代码量及工作量只是随着业务需求线性增加的,且无需考虑使用场景等带来的额外约束

    请配上必要的注释,以免别人接手后一脸问号

    如果需要在不同场景下显示出不同的顺序,那就需要再额外处理了

  • 相关阅读:
    redis实现未支付时间超时就删除订单,并给前端反应一个已过期
    八、stm32-TIM定时器(PWM)
    机器学习之决策树【西瓜书】
    java计算机毕业设计健身房管理系统演示录像2021源码+mysql数据库+系统+lw文档+部署
    系统架构设计专业技能 · 软件工程之UML建模设计
    使用 gst-plugins-bad 里面的 gst-element-maker 工具创建gstreamer 插件
    聊聊我认为的 “Kotlinic“
    m2ts是什么文件格式?m2ts手机能播放吗?
    微信小程序(分包)
    vue面试题7
  • 原文地址:https://blog.csdn.net/ymzhaobth/article/details/125618692