嵌套文字对象并按小写过滤

nested literal objects and filtering by lower case

我有一个页面,我在其中接收如下查询字符串值:

?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 和 sector,并将它们转换为小写字母,然后创建一个新对象。然后我 "trying" 为每个具有新 "value" 的对象创建一个新对象,所以我想要客户而不是客户。

是否有一种简单有效的方法来比较查询字符串与小写字母的嵌套文字对象 values/keys?如果我有其他 3-4 个嵌套级别怎么办,这意味着更多的嵌套循环。

我要什么时候通过?target=customer§or=private

到return:"T1 S1"作为字符串

如果我通过:?Target=cuSTomer§or=oThEr

到return:"T1 S3"作为字符串

有什么想法吗?

您可以在设置的最深层调换key/values,这样当给定'target'和'customer'时您可以直接找到'T1'。所以交换的设置对象看起来像:

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

这是一个进行此交换的函数,然后是 returns 一组翻译,您可以将其转换为 space 分隔的字符串:

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);