Я создаю сценарий, который проверяет наличие переменной в объекте. Для этого я использую 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;
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 также должен помочь.
Верно, хотя использование !! для приведения типа кажется излишним, когда простой вызов test() будет работать. Также обратите внимание, что я удалил свой голос против, однако ваша первая строка - test is a method of RegExp function - неверна. test() - это метод объекта Regexp, независимо от того, создается ли он явно (как в вашем примере) или через буквальную нотацию (как во фрагменте OPs). Важной частью вашего решения является использование конструктора с шаблоном конкатенированной строки.
@RoryMcCrossan Согласитесь, я пытался предположить, что OP не нужно создавать объект регулярного выражения и просто использовать getAjaxTranslation('length'). Я обновлю ответ соответственно
@RoryMcCrossan Я исправил и этот test - это метод объекта RegExp. Это то, что я имел в виду ранее.
@ gurvinder372: Хорошо, интересно. Будет ли match работать, когда некоторые spec.titles почти такие же? Итак, скажем, эти два названия спецификации: например, length и length (mm)? Или совпадение используется для точного совпадения всей строки?
Да, а также includes в этом отношении.
@ gurvinder372: Хорошо, я проверю это .... Я попробовал ваше первое решение, которое отлично работает. Так что я обязательно приму ваш ответ. Но я также протестирую ваши два других решения .... Спасибо за понимание, мне действительно нужно выучить эти regExp ... Они просто не будут висеть у меня в голове;)
@Meules Конечно, рад помочь.
вы создаете только строки, а не объекты регулярных выражений