Javascript 复制一个对象不';对我的代码没有影响

Javascript 复制一个对象不';对我的代码没有影响,javascript,jquery,d3.js,clone,Javascript,Jquery,D3.js,Clone,我假设复制一个对象source,而copy更改时,source不应更改。源代码如下: layoutTreemap: function(source) { var copy = jQuery.extend(true,{},source); var select_polygon = this.get_selected_polygon(); var vt = d3.layout.voronoitreemap() var layoutNodes = vt(copy

我假设复制一个对象
source
,而
copy
更改时,
source
不应更改。源代码如下:

layoutTreemap: function(source) {

    var copy = jQuery.extend(true,{},source);

    var select_polygon = this.get_selected_polygon();

    var vt = d3.layout.voronoitreemap()

    var layoutNodes = vt(copy);

    return layoutNodes;
}

d3.layout.voronoitreemap = function() {
    var hierarchy = d3.layout.hierarchy().sort(null),
    root_polygon = [[0,0],[500,0],[500,500],[0,500]], 
    iterations = 100,
    somenewvariable = 0;

    function voronoitreemap(d, depth) {
    var nodes = hierarchy(d),
    root = nodes[0];

    root.polygon = root_polygon;
    root.site = null;

    if (depth != null){
        max_depth = depth;
    }
    else{
        max_depth = "Infinity";
    }

    computeDiagramRecursively(root, 0);

    return nodes;
    }

    function computeDiagramRecursively(node, level) {
    var children = node.children;
    if(node.parent) node.parent = null;


    if (children && children.length && level < max_depth) {
        node.sites = VoronoiTreemap.init(node.polygon, node);  // can't say dataset, how about node?
        VoronoiTreemap.normalizeSites(node.sites);
        VoronoiTreemap.sites = node.sites;
        VoronoiTreemap.setClipPolygon(node.polygon);
        VoronoiTreemap.useNegativeWeights = false;
        VoronoiTreemap.cancelOnAreaErrorThreshold =  true;
        var polygons = VoronoiTreemap.doIterate(iterations);

        // set children polygons and sites
        for (var i = 0; i < children.length; i++) {
        children[i].polygon = polygons[i];
        children[i].site = VoronoiTreemap.sites[i];

        computeDiagramRecursively(children[i], (level + 1));

        }

    }
    }
    ....

    return d3_layout_hierarchyRebind(voronoitreemap, hierarchy); 
}
layoutTreemap:函数(源){
var copy=jQuery.extend(true,{},source);
var select_polygon=this.get_selected_polygon();
var vt=d3.layout.voronoitreemap()
var layoutNodes=vt(复制);
返回布局节点;
}
d3.layout.voronoitreemap=函数(){
var hierarchy=d3.layout.hierarchy().sort(null),
根_多边形=[[0,0],[500,0],[500500],[0500],
迭代次数=100,
somenewvariable=0;
函数voronoitreemap(d,深度){
变量节点=层次结构(d),
根=节点[0];
root.polygon=根多边形;
root.site=null;
if(深度!=null){
最大深度=深度;
}
否则{
最大深度=“无限”;
}
递归计算Diagram(根,0);
返回节点;
}
递归计算Diagram的函数(节点、级别){
var children=node.children;
如果(node.parent)node.parent=null;
if(children&&children.length&&level<最大深度){
node.sites=VoronoiTreemap.init(node.polygon,node);//不能说数据集,node呢?
规范化站点(node.sites);
VoronoiTreemap.sites=node.sites;
VoronoiTreemap.setClipPolygon(node.polygon);
VoronoiTreemap.useNegativeWeights=false;
VoronoiTreemap.cancelOnAreaErrorThreshold=true;
var polygons=VoronoiTreemap.doIterate(迭代);
//设置子多边形和站点
对于(变量i=0;i
但是在执行
vt(copy)
之后,
源代码已经更改。

这就产生了问题

root.polygon = root_polygon;
children[i].polygon = polygons[i];
您正在复制您认为的数组。但实际上,您正在将引用复制到数组。现在,您有两个指向同一对象的指针(想象两个人在吃饭时使用同一把叉子)

你需要把这个换成

root.polygon = root_polygon.slice();
children[i].polygon = polygons[i].slice();

这样就可以复制数组而不是引用数组。现在每个晚餐客人都有自己的叉子。

解释
不起作用
您的JSFIDLE演示清楚地显示
$.extend
起作用(即两个对象都不同)。因此,问题可能出在您的代码上,而不是
$。extend
。请编辑您的问题标题以反映实际问题。请参阅-正在运行您的示例代码包含此问题不需要的内容。尽量减少代码量,使其尽可能少地显示问题。