js判断条件如何用对象的形式进行优化?

这是一个过滤数据的一个判断函数,当字段为orderStatus和payType的时候进行过滤,其余字段正常输出,代码如下

formatJson: (filterVal, jsonData) => jsonData.map(v => filterVal.map(j => {
    switch (j) {
        case 'orderStatus':
          return vm.statusMap[v[j]]
        case 'payType':
          return vm.payMap[v[j]]
        default:
          return v[j]
      }
    })),

但是发现用switch的写法有点臃肿并且可以感觉可以优化,于是试着用对象的写法,如下

formatJson: (filterVal, jsonData) => jsonData.map(v => filterVal.map(j => ({
    'orderStatus': vm.statusMap[v[j]],
     'payType': vm.payMap[v[j]]
     } || v[j])))

但是这么写的话出现的问题是输出的是对象而不是对象对应的字段,请问这种情况应该昨晚那么做,把switch判断改成对象的方式或者更好的方法进行数据处理?

阅读 210
评论 2019-11-11 提问
    4 个回答

    你构造了类 hashTable 的对象,但是没有从中取值,写法应当如下:

    {
        'orderStatus': vm.statusMap[v[j]],
        'payType': vm.payMap[v[j]]
    }[j] || v[j]

    推荐使用 switch ,写法较为直观,而且大规模迭代的时候比较省内存。
    hashTable 适用于固定集合的映射,在迭代里不断构造 hashTable 不是明智之举。
    在这里用 hashTable 写出来也不是很简短,真的嫌臃肿的话可以级联三目运算符,没有空值的话甚至可以用短路运算。
    还有,提问的时候最好给一些测试数据。

    评论 赞赏

      看上去你是要把一个数组里每个对象的 orderStatuspayType 的值替换成 vm.statusMapvm.payMap 里对应的值(我猜是枚举值替换成对应的显示文本?)。

      没太看懂为啥你写这么复杂,还用了两层 map……

      jsonData.map(e => {
          e['orderStatus'] = vm.statusMap[e['orderStatus']];
          e['payType'] = vm.payMap[e['payType']];
          return e;
      });

      直接这么写不行么……

      目前没看出来你那个 filterVal 有啥用,也许不是所有场景下都需要做替换所以要先做个判断?

      jsonData.map(e => {
          filterVal.includes('orderStatus') && e['orderStatus'] = vm.statusMap[e['orderStatus']];
          filterVal.includes('payType') && e['payType'] = vm.payMap[e['payType']];
          return e;
      });
      评论 赞赏
            fucntion transform (key, val) {
                return (
                {        
                'orderStatus': vm.statusMap(val),
                'payType': vm.payMap(val)
                }
                )[key]
        
            }
            // 代理
            function formatJson (obj) {
        
                return new Proxy(obj, {
                    get: function(target, key, receiver) {
                    return transform(key, target[key]) || Reflect.get(target, key, receiver);
                  }
                }) 
            } 
            
            
            // 你的方法问题在于下面
            formatJson: (filterVal, jsonData) => jsonData.map(v => filterVal.map(j => {\
                //...................................................................这里需要返回值
                return  ({ 'orderStatus': vm.statusMap[v[j]], 'payType': vm.payMap[v[j]]})[j] || v[j])))
            }
            
        评论 赞赏
          撰写回答

          登录后参与交流、获取后续更新提醒