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
。请编辑您的问题标题以反映实际问题。请参阅-正在运行您的示例代码包含此问题不需要的内容。尽量减少代码量,使其尽可能少地显示问题。