jquery .each()错误地更新对象

时间:2014-08-11 09:57:49

标签: jquery

我有以下代码,基本上是对象中对象的对象。

alertQ = {
    0: {
        French: {
            start: "1am",
            duration: "1hr",
            status: "queued"
        }
    },
    1: {
        Italian: {
            start: "2am",
            duration: "2hr",
            status: "queued"
        }
    },
    2: {
        // ...etc...
    }
};

function sendTrades(){
    var trades = $J("#queue_listbox input:checked");
    $J.each(trades, function(key, val){ //iterate thru any selected option
        var id = val.value; //checkbox value contains object "id"
        $J.each(alertQ[id], function(key, val){
            Dbug(key);
            alertQ[id][key].status = "active";
            //val.status = "active"; //this was also tried with same result
        });
    });
    drawTrades(); //utility function. read only. creates the <input> checkbox elements for display, and is fired before this function to initialize the list
}

我可以正确导航到最里面的对象并从那里读取变量。 整个alertQ对象是用jQuery .each()循环构造的,基本上与sendTrades()试图修改它的方式相同。
它构建完美&amp;可从控制台访问。
单击按钮会触发sendTrades() 当我从大于1的列表中选择一个时出现问题,我们假设我选择了法语
Dbug(key);正确触发,仅命名法语 Dbug只是将数据传递给console.log()
所有status值都更改为"active"&lt;&lt;不应该发生

我尝试选择所有选项,控制台日志记录正确显示所有名称,并且所有status都应更改为"active"
但是,如果只改变上面提到的那些,它为什么会改变它们呢?

下面的HTML示例

<input value="0" type="checkbox">French
<input value="1" type="checkbox">Italian
<input value="2" type="checkbox">...etc...

如果需要,可以将第3个嵌套对象合并到第2个嵌套对象中。

1 个答案:

答案 0 :(得分:1)

我相信它并不像你将所有设置都设置为活动但在测试中,你并没有再次重置alertQ对象。因此,首次选择全部和所有状态都设置为&#34;活动&#34;,在第二次测试中,您只需选中一个框,并将其设置为活动状态,但之前的状态已设置为活动状态。

以下是示例:http://jsbin.com/vonumiqi/1/

//You need to reset the non active to queued or other status you want.

var tradesUnChecked = $("#check1 :not('input:checked')");
$.each(tradesUnChecked, function(key, val){ //iterate thru any selected option
    var id = val.value; //checkbox value contains object "id"
     console.log(alertQ[id]);
    $.each(alertQ[id], function(key, val){

        console.log(key);
        alertQ[id][key].status = "queued";
        //val.status = "active"; //this was also tried with same result
    });
});