在数组中存储数字会让人混淆如何根据值而不是索引来操作这些项目

时间:2012-06-19 19:16:26

标签: javascript arrays json

我对这个失去了理智。我的上一个问题回答了语法问题,但没有解决它使其正常运行的问题,所以这里有......

我的对象:

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

我的功能:

function buildFacets(key, val)
{
    if(key == 'country')
    {   
        filter.country = val;
    }
    else
    {
        if(val in filter[key])
        {
            delete filter[key][val];
        }
        else
        {
            filter[key].push(val);
        }
    }

    console.log(filter);
}

我的问题是我的功能是将传入值与数组索引进行比较,而不是数组值。例如,如果我调用buildFacets(“Age Group”,2),我将得到该数组为2的值。但是,如果我再次调用它,它只会向数组添加另一个值'2'而不是删除已存在的'2',因为它与索引进行比较,即0。

我希望我能解释这一点。如果需要澄清,请告诉我。

3 个答案:

答案 0 :(得分:1)

var idx = filter[key].indexOf(value);

if(idx != -1)
{
    filter[key].splice(idx, 1);
}
else
{
    filter[key].push(val);
}

答案 1 :(得分:0)

jQuery救援,但我很想知道非jQuery解决方案是什么:

function buildFacets(key, val)
{
    var pos = -1;

    if(key == 'country')
    {   
        filter.country = val;
    }
    else
    {
        pos = $.inArray(val, filter[key]);

        if(pos > -1)
        {
            filter[key].splice(pos,1);
        }
        else
        {
            filter[key].push(val);
        }
    }

    console.log(filter);
}

* EDIT / UPDAT * E(非jQuery版本,感谢xvatar

function buildFacets(key, val)
{
    var pos = -1;

    if(key == 'country')
    {   
        filter.country = val;
    }
    else
    {
        pos = filter[key].indexOf(val);

        if(pos > -1)
        {
            filter[key].splice(pos,1);
        }
        else
        {
            filter[key].push(val);
        }
    }

    console.log(filter);
}

答案 2 :(得分:0)

in运算符测试对象是否具有给定属性,但不检查成员资格。