我几乎没有JS对象。它们可以有任何结构:
{
name: "first",
_ref_id: 1234,
spec: {
_ref_id: 2345,
data: "lots of data"
}
}
{
name: 'second',
_ref_id: 5678,
container: {
_ref_id: 6789,
children: [
{_ref_id: 3214, name: 'Bob'}
{_ref_id: 1111, name: 'Mark'}
{_ref_id: 2222, name: 'Frank'}
]
}
}问题:
我需要复制这个对象,但要使用不同的_ref_ids。
创建“第一个”对象--我的样子如下:
first = {
name: "first",
_ref_id: uuid.v4(),
spec: {
_ref_id: uuid.v4(),
data: "lots of data"
}
}所以当我创建这个对象的时候,我知道它的结构,但是在一个我试图复制这个对象的地方,我没有这个对象的拷贝,我不知道这个对象的结构是什么,我所有的都是它自己的对象。因此,在“第一次”之后,我想要:
{
name: "first",
_ref_id: 8888,
spec: {
_ref_id: 9999,
data: "lots of data"
}
} 我没有定义_ref_id,而是在对象创建过程中定义了一种回忆录函数,即简单值:
refId(memoized = true){
var memo = {}
return () => {
if(!memoized) memo = {}
if(memo['_ref_id'])
return memo._ref_id
else {
memo._ref_id = uuid.v4()
return memo._ref_id
}
}
}所以我可以创建它:
first = {
name: "first",
_ref_id: refId(),
spec: {
_ref_id: refId(),
data: "lots of data"
}
}并且每当我试图访问first._ref_id的值时,都会将它更改为first._ref_id。
但我不知道如何从应对功能内部重新设置回忆录的变量,或者这是否可能?
有人有类似的问题吗?也许有一种不同的解决方法?
PS:
在这个项目中,我使用了lodash和immutable.js,但是我还没有为这个特定的任务找到任何帮助函数。
发布于 2016-02-05 15:12:00
受Most elegant way to clone a JS object启发,通过检查_ref_id字段:
function deepCopyWithNewRefId(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
if (attr == "_ref_id") {
copy[attr] = uuid.v4();
} else {
copy[attr] = deepCopyWithNewRefId(obj[attr]);
}
}
}
return copy;
}它的使用记录:
var uuid = { v4 : function(){ return Math.random()} };
var first = {
name: "first",
_ref_id: uuid.v4(),
spec: {
_ref_id: uuid.v4(),
data: "lots of data"
}
};
console.log(first._ref_id);
console.log(first.spec._ref_id);
var second = deepCopyWithNewRefId(first);
console.log(second);
console.log(second._ref_id);
console.log(second.spec._ref_id);
// the printed values are not the same. The rest of the object ishttps://stackoverflow.com/questions/35226592
复制相似问题