【问题标题】:javascript duplicates for on object bugjavascript重复对象错误
【发布时间】:2015-04-08 12:08:10
【问题描述】:

所以我有一个对象数组,并希望将该数组导出到另一个数组以用于将来的函数,但问题是在 for(对于每个数组)上,第一次运行顺利,但在第一次运行之后它将相同的内容添加到过去的运行中,例如,如果我有 2 个具有不同内容的数组并执行 for 函数,第一个数组与第二个数组相同。

代码如下:

 var mark = [];
//defult 
var x_mark = { c_mark_desc_col:[], c_mark_col: null,  c_mark_col_image: null, 
            c_mark_action: "click", c_mark_origin:[0,0], c_mark_col_valor: false,
            c_mark_style: [null]
            //,c_cluster: cluster[0]         
};
    for (var i = 0; i < extras.marks.length; i++) {

        mark[i] = x_mark;
        if(!(extras.marks[i].mark_desc_col === "" || typeof extras.marks[i].mark_desc_col=== "undefined" || extras.marks[i].mark_desc_col=== null))
            mark[i].c_mark_desc_col = extras.marks[i].mark_desc_col;
        if(!(extras.marks[i].mark_col === "" || typeof extras.marks[i].mark_col=== "undefined" || extras.marks[i].mark_col=== null))
            mark[i].c_mark_col = extras.marks[i].mark_col;
        if(!(extras.marks[i].mark_col_image === "" || typeof extras.marks[i].mark_col_image=== "undefined" || extras.marks[i].mark_col_image=== null))
            mark[i].c_mark_col_image = extras.marks[i].mark_col_image;
        if(!(extras.marks[i].mark_action === "" || typeof extras.marks[i].mark_action=== "undefined" || extras.marks[i].mark_action=== null))
            mark[i].c_mark_action = extras.marks[i].mark_action;
        if(!(extras.marks[i].mark_origin === "" || typeof extras.marks[i].mark_origin=== "undefined" || extras.marks[i].mark_origin=== null))
            mark[i].c_mark_origin = extras.marks[i].mark_origin;
        if(!(extras.marks[i].mark_col_valor === "" || typeof extras.marks[i].mark_col_valor=== "undefined" || extras.marks[i].mark_col_valor=== null))
            mark[i].c_mark_col_valor = extras.marks[i].mark_col_valor;
        if(!(extras.marks[i].mark_style === "" || typeof extras.marks[i].mark_style=== "undefined" || extras.marks[i].mark_style=== null))
            mark[i].c_mark_style = extras.marks[i].mark_style;
    }
    alert("outside of 'for' posição 0 antes " + extras.marks[0].mark_col + "  depois " + mark[0].c_mark_col);
    alert("outside of 'for' posição 1 antes " +extras.marks[1].mark_col + "  depois " + mark[1].c_mark_col);
}

【问题讨论】:

  • extras 对象是什么样的?

标签: javascript arrays object for-loop


【解决方案1】:

那是因为使用:

mark[i] = x_mark;

您在数组中引用 x_mark 变量,而不是将其复制/克隆为模型,因此每次更改都引用原始对象 x_mark。

尝试使用以下方法克隆它:

mark[i]=JSON.parse(JSON.stringify(x_mark));

相关:How do I correctly clone a JavaScript object?

【讨论】:

    【解决方案2】:

    问题在于您的线路mark[i] = x_mark;。您认为这会复制数组,但事实并非如此。它只是将mark[i] 设置为指向现有数组,当您更改它时,所有指向它的变量都会看到这种变化。

    试试这个例子,看看我的意思:

    var arr = [];
    var dflt = [ "abc" ];
    arr[0] = dflt;
    arr[1] = dflt;
    document.write("<br>"+arr[0][0]);  
    document.write("<br>"+arr[1][0]);
    arr[0][0] = "changed";             // only arr[0] is modified, but arr[1] is too
    document.write("<br>"+arr[0][0]);  // shows "changed" as expected
    document.write("<br>"+arr[1][0]);  // also shows "changed" instead of "abc"
    

    【讨论】:

    • 谢谢你的例子,我现在明白我的错误了
    • 不客气 - 如果有帮助,请将答案标记为有用
    • 我的声望低于 15,所以我不能标记为有用,如果不是这样,我会,以后我会(当我有的时候)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2014-01-15
    相关资源
    最近更新 更多