在JavaScript中有多种情况和失败之处,是否有其他替代方案可替代大型转换?

时间:2018-12-12 10:52:54

标签: javascript switch-statement

我需要将一些用户生成的字段映射到我正在使用的系统可以识别的字段。

为此,我们希望为用户提供一定的自由度,并为我们的每个字段提供五个左右的选项。

到目前为止,我们有一个可以完成任务的开关,但是现在我们必须扩展该开关,它将变得非常大。不用说这不是一种非常动态的方式。 还有其他选择吗?

function findHeader(object) {
  var title = object.toString().trim().toLowerCase()
  switch (title) {
    case 'name':
    case 'idea':
    case 'ide':
    case 'ide navn':
    case 'title':
    case 'idea name':
      title = 'name'
      break
    case 'beskrivelse':
    case 'problemet':
    case 'description':
    case 'the problem':
    case 'ide beskrivelse':
      title = 'description'
      break
    case 'ejer':
    case 'owner':
    case 'opfinder':
    case 'ide person':
    case 'idea person':
    case 'person':
      title = 'owner'
      break
    case 'duedate':
    case 'deadline':
    case 'tidsfrist':
    case 'sidste dato':
    case 'dato':
    case 'due date':
      title = 'duedate'
      break
    case 'billede':
    case 'billeder':
    case 'image':
    case 'images':
    case 'attachment':
      title = 'imageUrl'
      break
    case "":
      title = 'remove'
      break
    default:
      title = 'Unassigned'
      break
  }
  return title
}

4 个答案:

答案 0 :(得分:4)

也许是物体?

const titles = {
  'name':        ['name', 'idea', 'ide', 'ide navn', 'title', 'idea name'],
  'description': ['beskrivelse', 'problemet', 'description', 'the problem', 'ide beskrivelse'],
  'owner' :      ['ejer', 'owner', 'opfinder', 'ide person', 'idea person', 'person'],
  'duedate' :    ['duedate', 'deadline', 'tidsfrist', 'sidste dato', 'dato', 'due date'],
  'imageUrl' :   ['billede', 'billeder', 'image', 'images', 'attachment']
}
const getKey = (obj,val) => Object.keys(obj).find(key => obj[key].indexOf(val) !=-1 );

function findHeader(object) {  
  var title = object.toString().trim().toLowerCase();
  return getKey(titles,title) || 'Unassigned' 
}

console.log(
  findHeader("Owner"),
  findHeader("Bla")
)  

答案 1 :(得分:1)

您可以将数据存储在对象数组中并在其中搜索值,而不是switch

let arr = [
  {
    "title": "name",
    "values": ['idea','ide','ide navn','title','idea name']
  },
  {
    "title": "description",
    "values": ['beskrivelse','problemet','description','the problem','ide beskrivelse']
  },
  {
    "title": "owner",
    "values": ['ejer','owner','opfinder','ide person','idea person','person']
  },
];    

function findHeader(object) {
  let title = object.toString().trim().toLowerCase(),
      res = arr.filter(val => val.values.includes(title));    
  return res.length ? res[0].title : "Unassigned";
}

console.log(findHeader("problemet"));
console.log(findHeader("ide person"));
console.log(findHeader("opfinderrr"));

答案 2 :(得分:1)

您可以将正则表达式与对象一起使用,以基于一串键来获取项目的值:

const titles = {
  "name|idea|ide": "name",
  "beskrivelse|problemt|description|the problem": "description"
};

const get_item = item => titles[Object.keys(titles).find(key => new RegExp(`(\\||^)${item}(\\||$)`).test(key))];

let title = "problemt";
title = get_item(title); // Get the associated value from the key
console.log(title);

有关更多详细信息,请参见this answer

答案 3 :(得分:0)

如果人们期望不要太多数据,那么其他人发布的解决方案将是出色而优雅的。

如果性能至关重要,并且您有大量的字典,和/或要替换的术语很多(数量级为100k或更多数据片段),则使用switchcase的原始解决方案语句将是最好的语句,尤其是如果您在每一次break之后都加上赋值行和case语句(使其更加难看)。问题是您不能在运行时动态更新它。

但是,如果您不需要动态更新,则可以将switch语句的怪兽作为函数保存到一个单独的脚本文件中,以免使代码混乱。

要点是,尽管JavaScript对象的使用更为优雅,但我不会完全放弃switchcase解决方案,具体取决于应用程序。