У меня есть страница, на которой я получаю значения строки запроса, например:
?Target=Customers&Sector=Private
он также может принимать те же значения, что и строчные буквы, в зависимости от пользователя.
У меня есть следующий объект на моей странице:
var settings = {
Target = { T1: "Customer", T2: "Partner", T3 : "Other" },
Sector = { S1 : "Private", S2 : "Public", S3 : "Other" }
}
Мне нужно взять строку запроса и получить имена свойств, такие как T1, T2, S1 и т. д., поскольку я хочу отправить их куда-то еще.
Мой код для этого выглядит так:
//Here I am converting all the main settings properties to small letters, in csae the user passes "customer"
var settingskey, keys = Object.keys(settings);
var n = keys.length;
var newSettings = {};
while(n--){
settingskey = keys[n];
newSettings[settingskey.toLowerCase()] = settings[settingskey];
}
//Now I have my new object
var resultArray = ""; // This is the final array where I will fill the values like T1 S1
//get query string
var url = window.location.search;
//get rid of ? character
url = url.substring(1);
//separate each key, value pairs
var keyvalueArray = url.split('&');
//loop through all key value pairs
keyvalueArray.forEach(function(keyvalue){
//get key, ex: Target
var key = keyvalue.split('=')[0];
//get value, ex: Customer
var val = keyvalue.split('=')[1];
console.log(key);
console.log(val);
for(p in newSettings){
if(p == key.toLowerCase())
{
var element = {};
element = newSettings[key.toLowerCase()];
var elementValue, elementValues = Object.values(element);
var newElement = {};
var n = elementValues.length;
newElement.keys = element.keys;
while(n--){
elementValue = elementValues[n];
newElement[n] = elementValue.toLowerCase();
}
for(var prop in newElement){
if(element[prop] == val){
classArray+= "." + prop + ", ";
}
}
break;
}
}
});
resultArray = resultArray.substring(0, resultArray.lastIndexOf(',')).trim();
По сути, я получаю имена свойств в первый раз, например, Target и сектор, преобразовываю их в маленькие буквы и создаю новый объект. Затем я «пытаюсь» создать новый объект для каждого с новым «значением», поэтому вместо «Клиент» я хочу «Клиент».
Есть ли простой и эффективный способ сравнить строку запроса с вложенными литеральными значениями/ключами объекта, написанными маленькими буквами? что, если у меня есть еще 3-4 вложенных уровня, это означает больше вложенных циклов.
Я хочу, когда я перехожу ?target=customer§or=private
вернуть: "T1 S1" в виде строки
Если я прохожу: ?Target=cuSTomer§or=oThEr
вернуть: "T1 S3" в виде строки
Есть идеи?
for(p in newSettings) if(p == key.toLowerCase())
и замените его максимум наif (key.toLowerCase() in newSettings)
. - person Bergi   schedule 06.12.2016while
иnewElement
все же не нужны. Простоfor (var p in element) if (element[p].toLowerCase() == val) results.push(p.toLowerCase())
- person Bergi   schedule 06.12.2016