2016-12-05 32 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」 作爲一個字符串

如果我通過:目標=客戶&部門=其他

要返回:「T1 S3」作爲字符串

任何想法?

+0

請提供明確預期的輸出,基於示例。 – trincot

+0

枚舉對象以查找關鍵字沒有意義,只需查找屬性即可?如果(p == key.toLowerCase())'放棄'for(p in newSettings)'並且最多用'if(key.toLowerCase()in newSettings')替換它。 – Bergi

+0

@trincot我在帖子末尾做了一個修改,請檢查一下 – Jacky

回答

2

您可以在設置的最深層次上交換鍵/值,以便在給定'target'和'customer'時直接找到'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上試過了,我在這一行發現了一個錯誤:let swapped = Object。關鍵(設置).reduce((obj,key)=> {...它表示:期望; – Jacky

+0

事實上,這是ES6(EcmaScript2015)。我假設你支持這個,因爲你甚至使用Object.values ''在你自己的代碼中,哪個IE也不支持。無論如何,我更新了我的答案,所以它應該與ES5兼容。 – trincot