我目前在页面加载时使用所有可能的键/值对创建一个对象,并使用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实际上会根据该对象的值的存在来添加/删除对象。
我在如何处理这个问题上空白了。
答案 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
我认为这就是你想要做的。如果没有,请告诉我。