0

我目前在页面加载时使用所有可能的键/值对创建一个对象,并使用 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);
}

问题:

我用来应用这些过滤器的函数会循环遍历它们,因此如果我只存在诸如“年龄组”之类的对象(如果它包含任何值)会更有益。事实上,有这样的东西会很好:

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

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

我对如何处理这个问题一无所知。

4

1 回答 1

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

我假设这是你想要做的。如果没有,请告诉我。

于 2012-06-18T21:46:56.317 回答