gpt4 book ai didi

javascript - 制作 JS 对象的副本以更改给定键的出现

转载 作者:行者123 更新时间:2023-12-03 07:45:26 24 4
gpt4 key购买 nike

我的 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()

但我不知道如何从应对函数内部重置memoized变量,或者这是否可能?

有人遇到过类似的问题吗?也许有不同的方法来解决它?

附注:

我在这个项目中使用了 lodash 和 immutable.js,但我没有找到任何用于此特定任务的辅助函数。

最佳答案

灵感来自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 is

关于javascript - 制作 JS 对象的副本以更改给定键的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com