Есть ли альтернативы огромному переключателю, с несколькими случаями и прорывом в JavaScript? - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно сопоставить некоторые сгенерированные пользователем поля с тем, что может распознать система, над которой я работаю.

Для этого мы хотим предоставить пользователям определенную степень свободы и предложить около пяти вариантов для каждого из наших полей.

Пока у нас есть переключатель, который выполняет свою работу, ноТеперь мы должны расширить коммутатор, и он будет довольно большим.Это само собой разумеется не очень динамичный способ сделать это.Есть ли альтернативы?

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 голосов
/ 12 декабря 2018

Решения, опубликованные другими, великолепны и элегантны, если ожидать не слишком много данных.

Если производительность имеет решающее значение и у вас есть огромные словари и / или множество терминов для замены (порядка 100 тысяч или более фрагментов данных), тогда ваше исходное решение использует операторы switch и caseбудет лучшим, особенно если после каждой строки case ставить строку присваивания и оператор break (что еще хуже).Проблема в том, что вы не можете динамически обновлять это во время выполнения.

Но если вам не нужны динамические обновления, вы можете сохранить этого монстра оператора switch в отдельном файле скрипта как функцию, вне поля зрения, сохраняя ваш код в чистоте.

Дело в том, что, хотя использование объектов JavaScript намного элегантнее, я бы не стал полностью сбрасывать со счетов решение switch & case, в зависимости от приложения.

0 голосов
/ 12 декабря 2018

Возможно, объект?

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")
)  
0 голосов
/ 12 декабря 2018

Вы можете использовать регулярное выражение с объектом, чтобы получить значение элемента на основе строки ключей:

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);

См. этот ответ для получения дополнительной информации.

0 голосов
/ 12 декабря 2018

Вы можете хранить данные в массиве объектов и искать в нем значения вместо 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"));
...