【发布时间】:2015-05-05 23:37:33
【问题描述】:
简介:
我正在尝试编写深拷贝方法,但需要跟踪我访问过的节点,以便我可以链接到以前的visitedNode,而不是永远深拷贝直到堆栈溢出。
尝试:
var visitedNodes = {};
var obj = {}; obj.a = obj; // circular; can't use JSON.stringify)
var obj2 = {};
visitedNodes[obj] = "should need key obj (not obj2) to access this string";
console.log(visitedNodes[obj2]); // logs the string unfortunately
我没有一种独特的方式来存储内存位置——它将自己存储在[object Object],我不能使用 JSON.stringify,因为它是一个循环结构
我尝试使用var visitedNodes = new Map();,但仍然没有骰子
我目前的方法是使用Array.prototype.indexOf 函数,但我不知道它是否也适用于循环结构,因为我在这里也遇到堆栈溢出!!!
this.clone = function (item, visitedNodes) {
visitedNodes = visitedNodes || [];
if (typeof item === "object" && !Array.isArray(item)) {
if (visitedNodes.indexOf(item) === -1) {
var cloneObject = {};
visitedNodes.push(cloneObject);
for (var i in item) {
if (item.hasOwnProperty(i)) {
cloneObject[i] = this.clone(item[i], visitedNodes);
}
}
return cloneObject;
} else {
return visitedNodes[visitedNodes.indexOf(item)];
}
}
else if (typeof item === "object" && Array.isArray(item)) {
if (visitedNodes.indexOf(item) === -1) {
var cloneArray = [];
visitedNodes.push(cloneArray);
for (var j = 0; j < item.length; j++) {
cloneArray.push(this.clone(item[j], visitedNodes));
}
return cloneArray;
} else {
return visitedNodes[visitedNodes.indexOf(item)];
}
}
return item; // not object, not array, therefore primitive
};
问题:
任何人有任何想法来获得一个唯一的内存地址,这样我就可以确定我以前是否去过对象的引用?我相信我可以基于 Object.keys() 和 Object.prototype.constructor 构造一个唯一的哈希,但这似乎很荒谬,如果构造函数相同并且子键与父键相同,则会给出误报
【问题讨论】:
-
看看 Douglas Crockford 的 JSON.decycle:stackoverflow.com/questions/24075308/…
标签: javascript json clone deep-copy