for loop bug,需要帮助解决

时间:2014-05-30 16:58:17

标签: javascript jquery html cookies

我有这个.click函数,我将检索一个cookie信息(其中包含3个包含多个元素的索引)

关于我的意思的参考示例

  

array = {name:“sam”surname:“tan”} {name:“jam”surname:“man”} {   姓名:“gam”姓:“wan”}

所以我通过将其解析为变量来调用它 然后我创建了另一个新变量,并执行if,else函数将元素过滤到新数组中,因为我的.click函数是检查修改名字/姓氏的人然后按更新按钮,这就是为什么我是听.click,我的代码非常多,所以我只是把它的一部分用于参考目的

$('#update').click(function(){
                        clickedProfile.surname = $("input[name=contact-surname]").val();
                        clickedProfile.name = $("input[name=contact-name]").val();
                        clickedProfile.gender = $("input[name=contact-gender]").val();
                        $("#contact-surname").text('Surname is ' + $("input[name=contact-surname]").val());
                        $("#contact-name").text('Name is ' + $("input[name=contact-name]").val());
                        $("#contact-gender").text('Gender is ' + $("input[name=contact-gender]").val());

                        var c = JSON.parse($.cookie('cookiecontact'));
                        var d = [];

                        for(var i = 0; i < c.length; i++)
                        {
                            if(globalID == i)
                            {
                                d.push(clickedProfile); // in array, for that element it will store in the updated value
                            }
                            else
                            {
                                d.push(c[i]); // push in remaining non affected indexes into array
                            }
                        }

                        d.sort(function(a, b){
                            return a.name.localeCompare(b.name)
                        });

                        $.cookie('cookiecontact', JSON.stringify(d));
                        console.log($.cookie('cookiecontact'));
                    });

我将为我的目的解释代码

clickedProfile.surname = $("input[name=contact-surname]").val();
clickedProfile.name = $("input[name=contact-name]").val();
clickedProfile.gender = $("input[name=contact-gender]").val();

我在另一个函数上有一个声明的clickProfile,它会附加一个LI列表的唯一ID,所以如果我的点击是在第一个LI上,clickFrofile将附加一个LI ID = 0,它链接到数组[0 ]元素。

所以对于我的for循环,如果单击LI,则if语句将运行以将更新的代码推送到contacts数组中索引的元素

然后如果它与我点击的全局ID不匹配,它将继续将其余的索引元素推送到var D中。

当我刷新更新列表的页面时,

例子:开始是 我的主要li表单只显示contacts数组中每个索引的名称值

  • SAM
  • 果酱
  • GAM
  • 我第一次尝试将sam更改为zam时,它运行正常输出

  • 果酱
  • GAM
  • ZAM
  • 第二次我尝试将zam更改为cam它将开始表现出奇怪的输出

  • 凸轮
  • 凸轮
  • 果酱
  • 并且在第3次尝试更换果酱后禁止它将成为

  • 我不知道造成这种情况的原因是每次按更新后它似乎都会更改其他一个索引。

    到目前为止,我对该函数的逻辑是

    1. 从cookie中检索值(cookie有3个预设元素字符串)
    2. 过滤成新变量,如果全局id ==匹配,则将更新 这些元素中的信息,同时推入其余的元素 元素
    3. 按字母顺序排序
    4. 存入cookie
    5. 转到另一页并返回查看更新列表
    6. 我认为我的逻辑目前还不错,但不确定我在哪里做错了。请指出我的错误谢谢!

    1 个答案:

    答案 0 :(得分:0)

    这种数组排序算法可能是罪魁祸首。

    d.sort(function(a, b){
        return a.name.localeCompare(b.name)
    });
    

    按名称对数组进行排序时,数组索引不再与globalID匹配。然后,下次单击时,cookie数组中会替换错误的项目。

    这是http://jsfiddle.net/F8RvB/的工作版本:

    var clickedProfile = {};
    var globalID = 0;
    var cookieContact = [{ name:"one" ,surname:"oner", gender:"male", id:0 }, { name:"two", surname:"twoer", gender: "male", id:1 }, { name:"three", surname:"threer" , gender: "male", id:2}];
    
    $('#update').click(function(){
    
    clickedProfile.surname = $("input[name=contact-surname]").val();
    clickedProfile.name = $("input[name=contact-name]").val();
    clickedProfile.gender = $("input[name=contact-gender]").val();
    clickedProfile.id = globalID;
    $("#contact-surname").text('Surname is ' + $("input[name=contact-surname]").val());
    $("#contact-name").text('Name is ' + $("input[name=contact-name]").val());
    $("#contact-gender").text('Gender is ' + $("input[name=contact-gender]").val());
    
    var c = cookieContact;
    var d = [];
    
    for(var i = 0; i < c.length; i++)
    {
        if(globalID == i)
        {
            d.push(clickedProfile); // in array, for that element it will store in the updated value
        }
        else
        {
            d.push(c[i]); // push in remaining non affected indexes into array
        }
    }
    
    d.sort(function(a, b){
        return a.id > b.id;
    });
    
    cookieContact = d;
    console.log(cookieContact);
    });
    

    为了简单起见,我删除了cookie函数,并将其替换为硬编码的POJO数组。不确定为什么要对数组进行排序...在这里的工作示例中,您可以完全删除排序。否则,您应该考虑在获取cookie的数据时进行排序以便稍后使用,或者根据排序的数组索引更新您的globalID。

    相关问题