JavaScript中更有效的选项对象

时间:2012-06-18 21:38:25

标签: javascript json

我目前在页面加载时使用所有可能的键/值对创建一个对象,并使用true或false来确定它们的状态。如果只有真实的物品存在,那将会更有效。

示例数据:

    filter =  {
            "country": 1,
            "Age Group": {
                2: false,
                3: true,
                4: false,
                5: false,
                6: false,
                7: false
            },
            "Gender": {
                1: false,
                2: false
            },
            "NEWSEC": {
                1: false,
                2: true,
                3: false,
                4: false,
                5: false
            },
            "Telco_Segment": {
                1: true,
                2: true,
                3: true,
                4: false,
                5: false,
                6: false
            }
    };

功能:

function facetBuilder(key, val)
{
    if(key == 'country')
    {   
        filter.country = val;
    }
    else
    {
        if( filter[key][val] == true )
        {
            filter[key][val] = false;
        }
        else
        {
            filter[key][val] = true;
        }
    }
    console.log(filter);
}

问题:

我用来应用这些过滤器的函数循环遍历它们,所以如果我只有“Age Group”这样的对象,如果它包含任何值,那将会更有益。事实上,拥有如下内容会很好:

    filter =  {
            "country": 1,
            "Age Group": [3],
            "NEWSEC": [2],
            "Telco_Segment": [1,2,3]
    };

调用facetBuilder实际上会根据该对象的值的存在来添加/删除对象。

我在如何处理这个问题上空白了。

1 个答案:

答案 0 :(得分:3)

您无需明确检查true。您可以通过执行以下操作来检查条目是否存在:

if(map[key]) {
  ...
  ...
}

但是,如果与该键相关联的值为0,那么这是一个问题,因此最好这样做:

if(typeof map[key] !== "undefined") {
   ...
   ...
}

在这种情况下,您希望使用typeof的原因是,与undefined的直接比较可能会出现问题,因为undefined可能会被其他代码覆盖:

window.undefined = "not undefined";
"not undefined" == "undefined" //returns a true value

然后你的代码看起来像这样:

if(typeof filter[key][val] !== "undefined" )
{
    delete filter[key][val]; //I'm assuming you want to remove it
}
else
{
    filter[key][val] = true;
}

另一件事,当检查一个真值时,就足以说

if([expression that evaluates to a boolean value]) {
    ...
}

您不必这样做:

if([expression that evaluates to a boolean value] == true) {
    ...
}

if([expression that evaluates to a boolean value] == false) {
    ...
}

检查属性是否存在的另一种方法是使用in运算符:

var stuff = {
   a: 10,
   c: 20,
   d: 30
};

var ay = "a"
console.log(ay in blab, "b" in blab, "c" in blab, "d" in blab);
>>true false true true

我认为这就是你想要做的。如果没有,请告诉我。