Рефакторинг JS-метода с несколькими необязательными аргументами - PullRequest
1 голос
/ 04 июля 2019

У меня есть функция, которая получает два аргумента, которые я хочу, чтобы они были необязательными (последние два):

const renderDate = (date, locale, format) => {
  if (locale === undefined) { locale = 'en' }
  if (format === undefined) { format = 'D MMM' }
  if (locale === 'de' && format === 'D MMM') {
    const indexD = format.lastIndexOf('D')
    format = `${format.slice(0, indexD + 1)}o${format.slice(indexD + 1, format.length)}`
  }

  moment.locale(locale)
  return moment(date).format(format)
}

console.log(renderDate('2019-09-04', 'Do MMM'));
<script src="https://momentjs.com/downloads/moment.js"></script>

Я не могу сделать что-то вроде этого:

const renderDate = (date, locale = 'en', format = 'D MMM') => {
  if (locale === 'de' && format === 'D MMM') {
    const indexD = format.lastIndexOf('D')
    format = `${format.slice(0, indexD + 1)}o${format.slice(indexD + 1, format.length)}`
  }

  moment.locale(locale)
  return moment(date).format(format)
}

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

renderDate('2019-09-04', 'Do MMM')

Теперь языковой стандарт (язык) - это неправильный формат.

Каков наилучший подход для решения этой проблемы?Должен ли я передать объект, а затем проверить наличие ключей?

Тогда я могу деструктировать, но я не уверен, что это лучший подход:

const renderDate = ({
  date,
  locale,
  format
}) => {
  if (locale === undefined) {
    locale = 'en'
  }
  if (format === undefined) {
    format = 'D MMM'
  }
  if (locale === 'de' && format === 'D MMM') {
    const indexD = format.lastIndexOf('D')
    format = `${format.slice(0, indexD + 1)}o${format.slice(indexD + 1, format.length)}`
  }

  moment.locale(locale)
  return moment(date).format(format)
}
console.log(renderDate('2019-09-04', 'Do MMM'));
<script src="https://momentjs.com/downloads/moment.js"></script>

1 Ответ

1 голос
/ 04 июля 2019

Да - объект - единственный способ решить эту проблему, если вы можете передать один, другой или оба из двух необязательных аргументов.Вы также можете использовать значения по умолчанию с этим.И обратите внимание, что ваш оператор if выполняется только, если format равен D MMM, поэтому вы можете удалить indexOf и просто использовать 0:

export const renderDate = ({ date, locale = "en", format = "D MMM" } = {}) => {
  if (locale === "de" && format === "D MMM") {
    const indexD = 0;
    format = `${format.slice(0, indexD + 1)}o${format.slice(indexD + 1, format.length)}`;
  }
  moment.locale(locale);
  return moment(date).format(format);
};
...