Упростите этот оператор if

#javascript

#javascript

Вопрос:

Есть ли способ упростить этот оператор if. Я нахожусь в этом senario много и хочу сделать его чище.

 if (item === 'christie' || item === 'chris') {
   return 'christine';
}
if (item === 'maddy' || item === 'madison') {
   return 'madeline';
}

return '';
 

Я создал пример ради вопроса, но есть ли более простой способ?

Комментарии:

1. Возможно, вы предпочтете switch оператор с ошибками.

Ответ №1:

Немного дольше, но легче быстро понять, что происходит. По крайней мере, по моему мнению.

 switch(item) {
  case 'christie':
  case 'chris':
    return 'christine';
  case 'maddy':
  case 'madison':
    return 'madeline';
  default:
    return '';
}
 

Вот еще один вариант, использующий includes

 if(['christie','chris'].includes(item)) {
 return 'christine';
}

if(['maddy','madison'].includes(item)) {
 return 'madeline';
}

return '';
 

Ответ №2:

Один из вариантов предполагает, что предоставленные вами имена являются единственными параметрами имени, а возвращаемое значение соответствует префиксу.

 return item.startsWith('chr') ? 'christine' : item.startsWith('mad') ? 'madeline' : '';

 

Если вы хотите остаться, if вы можете использовать:

 if (item.startsWith('chr')) return 'christine';
if (item.startsWith('mad')) return 'madeline';
return '';
 

Комментарии:

1. Это будет работать, только если входные данные всегда находятся в этих четырех именах, но будет определять madness as madeline и chrome as christine

2. Правильно, и я четко сделал это предположение в первой строке. Это решение предназначено только для того, чтобы дать представление о дальнейшей оптимизации.

Ответ №3:

Вы можете использовать оператор switch

 function switch_names(item) {
  switch (item) {
    case "christie":
    case "chris":
      return "christine";
    case "maddy":
    case "madison":
      return "madeline";
    default:
      return "";
  }
}
const name=switch_names("chris")
console.log(name)
 

Ответ №4:

В зависимости от варианта использования может быть проще сделать что-то вроде следующего:

 const name_map = {
  'christie': 'christine',
  'chris': 'christine',
  'maddy': 'madeline',
  'madison': 'madeline',
};

const map_name = (name) => name_map[name] ? name_map[name] : name;

console.log('christie', map_name('christie'));
console.log('christine', map_name('christine'));
console.log('maddy', map_name('maddy')); 

Если вы хотите указать связь имен наоборот, вы, вероятно, могли бы сделать что-то вроде:

 const name_map = {
  'christine': ['christie', 'chris'],
  'madeline': ['maddy', 'madison'],
};

const flip = (obj) => Object.entries(obj)
  .reduce(
    (acc1, [name, alts]) => alts.reduce(
      (acc2, alt) => ({ ...acc2, [alt]: name }),
      acc1
    ),
    {}
  )

const flipped_name_map = flip(name_map);

const map_name = (name) => flipped_name_map[name] ? flipped_name_map[name] : name;

console.log('christie', map_name('christie'));
console.log('christine', map_name('christine'));
console.log('maddy', map_name('maddy'));
console.log('madison', map_name('madison')); 

Ответ №5:

 if (item === 'christie' || item === 'chris' ||item === 'maddy' || item === 'madison') 
{
   return item;
}
return '';
 

Ваш пост был очень неясным, чего именно вы хотите?

Комментарии:

1. Не совсем. Операционная система хочет сопоставить 'christie' и 'chris' с 'christine' и 'maddy' и 'madison' с madeline