Javascript - 克隆的全局变量被覆盖

时间:2016-08-11 20:24:42

标签: javascript

我在网页上有一组图表。我想保留他们的数据副本和修改它们之前的DIV ID,以便我可以随时重用静态全局副本。 (这将是图表原始数据的数组)。还有一个名为'globalMasterList'的相同数据的全局可更改副本。

这是我到目前为止所尝试的内容。我遇到的问题是尽管使用“克隆”方法,备份静态副本,似乎有一些对可更改的全局副本的引用。当我更改全局可更改副本时,静态全局副本也会更改。我现在已经花了几天时间,但却无法弄明白。我没有运气也尝试了一些不同的东西。

我很感激帮助我解决这个问题。

我在网页上有一组图表。我想保留他们的数据副本和修改它们之前的DIV ID,以便我可以随时重用静态全局副本。 (这将是图表原始数据的数组)。还有一个名为'globalMasterList'的相同数据的全局可更改副本。

这是我到目前为止所尝试的内容。我遇到的问题是尽管使用“克隆”方法,备份静态副本,似乎有一些对可更改的全局副本的引用。当我更改全局可更改副本时,静态全局副本也会更改。我现在已经花了几天时间,但却无法弄明白。我没有运气也尝试了一些不同的东西。

我很感激帮助我解决这个问题。

function modifyGroupingDefault() {
    var numDivs = 5;
    var divDrawId = 'div5';


    if (staticCopyoFGlobalCopy.length !== numDivs) {    
        staticCopyoFGlobalCopy.length = 0;  //  Clear the array just in case some junk elements have sneked in
        for (var x in masterList) { // Iterate through the charts on the web page
                var tempObj = {};   //  Temporary object
                tempObj.plotId = clone(globalMasterList[x].div.id); // Clone Div ID
                tempObj.divData = clone(globalMasterList[x].data);  // Clone the dataset
                staticCopyoFGlobalCopy.push(tempObj);   //  Push the cloned object into array
        }
    }

    for (var x in globalMasterList) {
        if (globalMasterList[x].div.id === divDrawId) { // Check if the current Div ID in the iteration loop is the Div ID of the chart whose groupingbutton is clicked
            delete globalMasterList[x].dataset; //  Remove the chart's data provider
            for (y in staticCopyoFGlobalCopy) { //  Iterate through the static/non-changable global copy
                if (staticCopyoFGlobalCopy[y].plotId === divDrawId) {   
                    globalMasterList[x].data = staticCopyoFGlobalCopy[y].divData;   // Set the current chart's data to the dataset from the immutable chart array
                    // Some operation on globalMasterList
                    //Some operation onglobalMasterList
                    // Some operation onglobalMasterList
break;  // Goal achieved. break out
                }
            }
            break;  // Goal achieved. Break out
        }
    }
}

/*
    *
    *   Clone function
    *
*/

function clone(obj) {
    var copy;
    // Handle the 3 simple types, and null or undefined
    if (null === obj || "object" !== typeof obj)
        return obj;
    // Handle Date
    if (obj instanceof Date) {
        copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
        copy = [];
        for (var i = 0, len = obj.length; i < len; ++i) {
            copy[i] = clone(obj[i]);
        }
        return copy;
    }

    // Handle Object
    if (obj instanceof Object) {
        copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr))
                copy[attr] = clone(obj[attr]);
        }
        return copy;
    }
    throw new Error("Unable to copy obj! Its type isn't supported.");
}

1 个答案:

答案 0 :(得分:0)

早已解决。结束手续。