对象上错误的javascript重复

javascript duplicates for on object bug

本文关键字:javascript 重复 错误 对象      更新时间:2023-09-26

所以我有一个对象数组,并希望将该数组导出到另一个数组以用于未来的函数,但问题是,在for(对于每个数组)上,第一次运行很顺利,但在第一次运行后,它将相同的内容添加到过去的运行中——例如,如果我有两个内容不同的数组并执行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);
}

这是因为使用:

mark[i] = x_mark;

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

尝试使用进行克隆

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

相关:如何正确克隆JavaScript对象?

问题出在您的线路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"