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判断改成对象的方式或者更好的方法进行数据处理?

阅读 2.1k
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])))
    }
    
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏