2016-12-05 9 views
1

У меня есть страница, где я получаю значение строки запроса, как следующее:вложенные буквальные объекты и фильтрация по нижнему регистру

?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 вложенных уровня, это означает больше вложенных циклов.

Я хочу, чтобы, когда я прохожу цель = клиент & сектор = частный

вернуться: "T1 S1" в виде строки

Если я прохожу: Target = Заказчик & сектор = ДРУГОЙ

для возврата: «T1 S3» как строка

Любая идея?

+0

Просьба четко ожидаемый результат, основанный на примере. – trincot

+0

Нет смысла перечислять объект для поиска ключа, когда вы просто можете найти свойство? Отбросьте 'for (p в newSettings), если (p == key.toLowerCase())' и замените его на 'if (key.toLowerCase() в newSettings)' максимум. – Bergi

+0

@trincot Я сделал редактирование в конце сообщения, пожалуйста, проверьте его – Jacky

ответ

2

Вы можете поменять ключ/значения на самом глубоком уровне ваших настроек, чтобы вы могли напрямую находить «T1» при задании «цель» и «клиент». Таким образом, места объекта настройки будет выглядеть:

var settings = { 
    target: { customer: "T1", partner: "T2", other: "T3" }, 
    sector: { private: "S1", public: "S2", other: "S3" } 
} 

Вот функция, которая делает этот обмен, а затем возвращает массив переводов сделали, что вы можете превратить в пространстве разделенных строки:

function getCodes(url, settings) { 
 
    var swapped = Object.keys(settings).reduce(function (obj, key) { 
 
     obj[key.toLowerCase()] = Object.keys(settings[key]).reduce (function (obj2, key2) { 
 
      obj2[settings[key][key2].toLowerCase()] = key2; 
 
      return obj2; 
 
     }, {}); 
 
     return obj; 
 
    }, {}); 
 
    return url.toLowerCase().split(/[?&#]/).slice(1).map(function (arg) { 
 
     var parts = arg.split('='); 
 
     return swapped[parts[0].toLowerCase()][parts[1].toLowerCase()]; 
 
    }); 
 
} 
 

 
var url= 'http://www.example.com?Target=Customer&Sector=Private'; 
 

 
var settings = { 
 
    Target: { T1: "Customer", T2: "Partner", T3 : "Other" }, 
 
    Sector: { S1 : "Private", S2 : "Public", S3 : "Other" } 
 
} 
 

 
var result = getCodes(url, settings).join(' '); 
 

 
console.log(result);

+0

Это удивительно ..! Но поддерживается ли это в старых браузерах? Это ECMAscript 2015? – Jacky

+0

Я пробовал это на IE11, и я получил ошибку на этой строке: пусть swapped = Object.ключи (настройки) .reduce ((obj, key) => {... он сказал: Ожидаемый; – Jacky

+0

Действительно, это ES6 (EcmaScript2015). Я предположил, что у вас есть поддержка для этого, поскольку вы даже использовали 'Object.values 'в вашем собственном коде, который IE не поддерживает. Во всяком случае, я обновил свой ответ, чтобы он теперь был совместим с ES5. – trincot