這應該做你正在尋找的東西,包括循環引用。
編輯:請記住,這將變得越來越慢,對於有很多循環引用裏面的對象!查看引用是否被查看只是一個簡單的掃描。
var util = require('util')
var propertiesToCopy = {
'a' : true,
'b' : true,
'c' : true,
'd' : true,
'e' : true,
'f' : true,
'p1': true,
'p2': true,
'g' : true
};
var obj;
obj = {
p2 : {
a : 1,
b : 2,
c : {},
d : {
f : 2
}
},
p3 : 'hello'
};
// circular
obj.p1 = obj;
obj.p2.d.e = obj;
// sub-circular
obj.p2.g = obj.p2.c;
function getNewObjectFromObjects(obj, objects) {
for (var i = 0; i < objects.length; i++) {
if (obj === objects[i].old) return objects[i].new;
}
return false;
}
function whiteListedCopy(obj, whitelist, root, newRoot, objects) {
var cloned = {};
var keys = Object.keys(obj);
root = root || obj;
newRoot = newRoot || cloned;
objects = objects || [ {'old' : root, 'new': newRoot} ];
keys.forEach(function(val) {
if (whitelist[val] === true) {
if (typeof(obj[val]) === typeof({}) ||
typeof(obj[val]) === typeof([])) {
var reference = getNewObjectFromObjects(obj[val], objects);
if (reference === false) {
cloned[val] = whiteListedCopy(obj[val], whitelist, root, newRoot, objects);
objects.push({ 'old' : obj[val], 'new': cloned[val]});
} else {
cloned[val] = reference;
}
} else {
cloned[val] = obj[val];
}
}
});
return cloned;
}
var clonedObject = whiteListedCopy(obj, propertiesToCopy);
console.log(util.inspect(clonedObject));
console.log('assert c and g are same reference:', clonedObject.p2.g === clonedObject.p2.c);
console.log('assert p1 is circular:', clonedObject === clonedObject.p1);
你能給一個對象的例子,以及你目前如何做它(實際的代碼)? – Xotic750
Porque沒有遞歸?就像http://stackoverflow.com/questions/31215369/javascript-how-to-filter-arrays-mathcing-a-keyword/31215528#31215528,除了按名稱複製某些屬性 – Jan