我们如何在开关代码下方更优化?

时间:2019-01-17 15:49:28

标签: typescript ecmascript-6

下面的代码工作正常。但是我要优化它。我怎样才能用更少的时间实现相同的功能。有没有机会改善下面的代码。小小的帮助将不胜感激。

  setDefaultIndex(selectedFit, defaults, array, fab) {
    const defaultValue =  defaults.filter(item => item.fitCode === selectedFit);
    let selectedIndex: number;
    switch (fab) {
      case 'exterior':
        selectedIndex = array.findIndex(fabric => fabric.id === defaultValue[0].exteriorFabricCode);
        break;
     case 'body':
       selectedIndex = array.findIndex(fabric => fabric.id === defaultValue[0].bodyLiningCode);
       break;
     case 'sleeve':
       selectedIndex = array.findIndex(fabric => fabric.id === defaultValue[0].sleeveLiningCode);
       break;
     default:
       selectedIndex = 0;
       break;
    }
    return selectedIndex;
   }

2 个答案:

答案 0 :(得分:1)

  1. 创建一个将fab值映射为默认值(fabToKey)的对象(或Map)。
  2. 创建一个接受值并返回谓词的函数(getPredicate)。
  3. setDefaultIndex中,从fab获取fabToKey的值。如果密钥为假,则返回0;
  4. 使用defaultValue获取Array.find()。注意:您需要处理未找到的情况-即find返回null
  5. 使用通过findIndex()调用getPredicate创建的谓词运行defaultValue[key]

示例(未经测试):

const fabToKey = { exterior: 'exteriorFabricCode', body: 'bodyLiningCode', sleeve: 'sleeveLiningCode' };

const getPredicate = value => ({ id }) => id === value;

setDefaultIndex(selectedFit, defaults, array, fab) {
  const key = fabToKey[fab];

  if (!key) return 0;

  const defaultValue = defaults.find(item => item.fitCode === selectedFit);

  // do something if defaultValue is null - ie selectedFit wasn't found

  return array.findIndex(getPredicate(defaultValue[key]));
}

答案 1 :(得分:0)

像这样的东西就足够了吗:

setDefaultIndex(selectedFit, defaults, array, fab) {
  const defaultValue =  defaults.filter(item => item.fitCode === selectedFit);
  let selectedIndex: number = 0;
  const id = fab => {
    case 'exterior': return defaultValue[0].exteriorFabricCode
    case 'body': return defaultValue[0].bodyLiningCode'
    case 'sleeve': return defaultValue[0].sleeveLiningCode'
    default: false
  }
  return id(fab) ? array.findIndex(f => f.id === id(fab)) : selectedIndex
}