Динамическая переменная с regEx

Я создаю сценарий, который проверяет наличие переменной в объекте. Для этого я использую regEx, чтобы проверить, присутствует ли это конкретное имя в объекте.

Проблема, с которой я столкнулся, заключается в том, что ответ JSON иногда переводится на немецкий или испанский. Итак, в приведенном ниже случае я хочу протестировать spec.title на имя Length (mm). Это название также может быть Länge (mm) и Longitud (mm).

В моем проекте уже есть встроенная функция перевода под названием getAjaxTranslation('string'). Таким образом, этот getAjaxTranslation('length') вернет переведенную строку для длины.

Итак, мой вопрос: как я могу использовать getAjaxTranslation('length') в приведенном ниже коде для тестирования?

Итак, я попробовал:

reLength = '/'+ getAjaxTranslation('length') + '/i' //just to try
reLength = "'+ getAjaxTranslation('length') + '";
reLength = getAjaxTranslation('length')

Вышеупомянутые попытки дают ошибки, такие как reLength.test is not a function и т. д. Так что, вероятно, я работаю с неправильной строкой / переменными или делаю что-то действительно не так. У меня все еще проблемы с этими regEx ...

Любая помощь очень ценится!

Полный код:

var data = {
  "product": {
    "specs": {
      "231638": {
        "id": 231638,
        "title": "Length (mm)",
        "value": "1200"
      },
      "231641": {
        "id": 231641,
        "title": "Width (mm)",
        "value": "800"
      },
      "231644": {
        "id": 231644,
        "title": "Height (mm)",
        "value": "144"
      } //etc etc
    }
  }
};

var length = 0, width = 0, height = 0,
  reLength = /length/i,
  reWidth = /width/i,
  reHeight = /height/i;
$.each(data.product.specs, function (specId, spec) {
  if (reLength.test(spec.title))
    length = spec.value;
  else if (reWidth.test(spec.title))
    width = spec.value;
  else if (reHeight.test(spec.title))
    height = spec.value;
});

вы создаете только строки, а не объекты регулярных выражений

Patrick Evans 04.04.2018 12:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Above tries give errors like reLength.test is not a function etc.

test - это метод объекта RegExp, сделайте это

reLength =  new RegExp( getAjaxTranslation('length') , "i" )

Или используйте match вместо test, например

reLength =  getAjaxTranslation('length'); //no need to make a regexp object
!!spec.title.match(reLength)

или же

reLength =  getAjaxTranslation('length'); 
spec.title.includes(reLength) //use includes

Соответствие @RoryMcCrossan вернет либо вывод ссылки на массив, либо ноль, поэтому сам match также должен помочь.

gurvinder372 04.04.2018 12:43

Верно, хотя использование !! для приведения типа кажется излишним, когда простой вызов test() будет работать. Также обратите внимание, что я удалил свой голос против, однако ваша первая строка - test is a method of RegExp function - неверна. test() - это метод объекта Regexp, независимо от того, создается ли он явно (как в вашем примере) или через буквальную нотацию (как во фрагменте OPs). Важной частью вашего решения является использование конструктора с шаблоном конкатенированной строки.

Rory McCrossan 04.04.2018 12:44

@RoryMcCrossan Согласитесь, я пытался предположить, что OP не нужно создавать объект регулярного выражения и просто использовать getAjaxTranslation('length'). Я обновлю ответ соответственно

gurvinder372 04.04.2018 12:45

@RoryMcCrossan Я исправил и этот test - это метод объекта RegExp. Это то, что я имел в виду ранее.

gurvinder372 04.04.2018 12:49

@ gurvinder372: Хорошо, интересно. Будет ли match работать, когда некоторые spec.titles почти такие же? Итак, скажем, эти два названия спецификации: например, length и length (mm)? Или совпадение используется для точного совпадения всей строки?

Meules 04.04.2018 12:58

Да, а также includes в этом отношении.

gurvinder372 04.04.2018 13:01

@ gurvinder372: Хорошо, я проверю это .... Я попробовал ваше первое решение, которое отлично работает. Так что я обязательно приму ваш ответ. Но я также протестирую ваши два других решения .... Спасибо за понимание, мне действительно нужно выучить эти regExp ... Они просто не будут висеть у меня в голове;)

Meules 04.04.2018 13:06

@Meules Конечно, рад помочь.

gurvinder372 04.04.2018 13:07

Другие вопросы по теме