Две строки в JavaScript одного типа и значения не оцениваются как true при сопоставлении с ассоциативным массивом - PullRequest
0 голосов
/ 24 апреля 2018
monthDateMapper(month) {
  const months = {'Jan': '01', 'Feb': '02', 'Mar': '03'
                ,'Apr': '04', 'May': '05', 'Jun': '06'
                ,'July': '07', 'Aug': '08', 'Sep': '09'
                , 'Oct': '10', 'Nov': '11', 'Dec':'12'}
  let monthDate;
  for(var monthAbrev in months) {
    month === monthAbrev ? monthDate = months[monthAbrev] : monthDate = 'Invalid Value'
  }
  return monthDate
}

Предполагая, что я ударил свою функцию с помощью monthDateMapper ('Apr'), почему в моем условном выражении никогда не присваивается monthDate равным 04.

Я прочитал несколько статей на тему соответствия строк вJavascript;большинство из них говорят, что такого рода проверка типов никогда не будет правдой, даже если оба типа являются строками и имеют одинаковое значение:

Один из ответовпредложил использовать lodash _.isEqual (), это не сработало.Также я попытался преобразовать строчные буквы с обеих сторон, также пытаясь преобразовать их оба далее в 2 строки.Я подтвердил, что они были двумя строками через typeOf.

Есть ли способ обойти это?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вы выполняете итерацию по всем ключам и не останавливаете итерацию, когда ваше условие истинно.Кстати, вам не нужно повторять в течение нескольких месяцев:)

function monthDateMapper(month) {
   const months = {'Jan': '01', 'Feb': '02', 'Mar': '03'
            ,'Apr': '04', 'May': '05', 'Jun': '06'
            ,'July': '07', 'Aug': '08', 'Sep': '09'
            , 'Oct': '10', 'Nov': '11', 'Dec':'12'}

  return months[month] || 'Invalid Value'
};
0 голосов
/ 24 апреля 2018

Вы сравниваете 12 раз и назначаете 12 раз, поэтому последнее сравнение относится к Dec, который присваивает «Неверное значение».Это вызвано некорректной логикой на нескольких уровнях.

Я думаю, вам лучше использовать массив названий месяцев и indexOf():

function monthDateMapper(month) {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  var index = months.indexOf(month);
  return index == -1 ? 'Invalid Value' : index + 1; // or (index+1).toString() if needed
};

console.log(monthDateMapper('Jan'));
console.log(monthDateMapper('Apr'));
console.log(monthDateMapper('Dec'));
console.log(monthDateMapper('ZZZ'));

PS Обратите внимание, что я также изменил «июль» на «июль» для согласованности.

0 голосов
/ 24 апреля 2018

Потому что вы зациклились 12 раз. В один из этих случаев monthDate присваивается значение 04, а в остальных 11 раз ему присваивается значение Invalid Value. Если на последней итерации цикла не назначено правильное значение, оно просто перезаписывается Invalid Value.

Как заметил Энди, ваш код может быть уменьшен до:

monthDateMapper(month) {
  const months = {'Jan': '01', 'Feb': '02', 'Mar': '03'
                ,'Apr': '04', 'May': '05', 'Jun': '06'
                ,'July': '07', 'Aug': '08', 'Sep': '09'
                , 'Oct': '10', 'Nov': '11', 'Dec':'12'}
  return months[month] ? months[month] : 'Invalid Value';
}
...