В отличие от PHP, JavaScript не предоставляет доступ к массиву globals (который содержит ссылки на все объявленные имена переменных). Таким образом, JavaScript не предлагает встроенную поддержку переменных переменных. Вы можете, однако, эмулировать эту функцию, пока вы определяете все свои переменные как часть массива или объекта. Это, в свою очередь, создаст для вас массив злодеев. Например, вместо объявления переменной hello
в глобальной области видимости следующим образом:
var hello = 'hello world';
давайте инкапсулируем ее внутри объекта. Мы будем называть этот объект vv (переменными переменными):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Теперь мы можем ссылаться на переменную по ее индексу, и поскольку индексы массива могут быть предоставлены с использованием переменной, мы фактически используем переменная переменная:
console.log(vv[referToHello]); //Output: hello world
Ответ на ваш вопрос
Давайте применим это к коду, указанному в исходном вопросе:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
A Практическое использование
Хотя предыдущий код может показаться смехотворно громоздким и непрактичным, существуют практические применения переменных переменных в JavaScript с использованием такого типа инкапсуляции. В приведенном ниже примере мы используем ту же концепцию, чтобы получить идентификатор неопределенного количества элементов HTML.
var elementIds = [],
elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
elements.forEach( (element) => {
elementIds[element] = document.getElementById(element);
});
В этом примере объявляются переменные переменные (ключи в elementIds
) на основе идентификатора каждого элемента , и назначит узел упомянутого элемента как значение каждой переменной. И поскольку использование глобальных переменных в JavaScript, как правило, не рекомендуется, если переменные переменные являются уникальной областью (в этом случае, объявив их внутри массива elementIds
) не только аккуратно, но и более ответственным.
Что-то подобное?
var myOptions = new List<string> { "Smith,John", "Doe, Bob" };
string myName = "John Smith";
var myKeywords = myName.Split(' ').ToList();
foreach (var myOption in myOptions)
{
if (Regex.Match(myOption,$"{myKeywords[1]},\\s?{myKeywords[0]}").Success)
{
result = myOption;
}
}
Ниже if
может true
, когда ваш John Smith
точно совпадает с Smith,John
.
if (MyOptions.Any(x => MyKeywords.All(y => x.Split(',').Contains(y))))
{
check = true;
}
Попробуйте перебрать myOptions. Внесите изменения в свой код следующим образом-
bool check = false;
string result = string.Empty;
string myName = "John Smith";
//note the space, this is intentional, as whether there is a space after the comma is inconsistent
var myOptions = new List<string> { "Smith,John", "Doe, Bob" };
var myKeywords = myName.Split(' ').ToList();
foreach(string s in myOptions)
{
if (myKeywords.All(s.Contains))
{
check = true;
}
}
Однако, это просто для того, чтобы дать вам представление, в этом случае вы должны протестировать все сценарии. Это будет работать, даже если запись myOptions (имя и фамилия не совпадают в точности)