首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使JS对象的副本更改给定键的出现

使JS对象的副本更改给定键的出现
EN

Stack Overflow用户
提问于 2016-02-05 14:29:27
回答 1查看 59关注 0票数 0

我几乎没有JS对象。它们可以有任何结构:

代码语言:javascript
运行
复制
{
  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。

创建“第一个”对象--我的样子如下:

代码语言:javascript
运行
复制
first = {
  name: "first",
  _ref_id: uuid.v4(),
  spec: {
    _ref_id: uuid.v4(),
    data: "lots of data"
  }
}

所以当我创建这个对象的时候,我知道它的结构,但是在一个我试图复制这个对象的地方,我没有这个对象的拷贝,我不知道这个对象的结构是什么,我所有的都是它自己的对象。因此,在“第一次”之后,我想要:

代码语言:javascript
运行
复制
{
  name: "first",
  _ref_id: 8888,
  spec: {
    _ref_id: 9999,
    data: "lots of data"
  }
} 

我没有定义_ref_id,而是在对象创建过程中定义了一种回忆录函数,即简单值:

代码语言:javascript
运行
复制
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
    }
  }
}

所以我可以创建它:

代码语言:javascript
运行
复制
first = {
  name: "first",
  _ref_id: refId(),
  spec: {
    _ref_id: refId(),
    data: "lots of data"
  }
}

并且每当我试图访问first._ref_id的值时,都会将它更改为first._ref_id。

但我不知道如何从应对功能内部重新设置回忆录的变量,或者这是否可能?

有人有类似的问题吗?也许有一种不同的解决方法?

PS:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-05 15:12:00

Most elegant way to clone a JS object启发,通过检查_ref_id字段:

代码语言:javascript
运行
复制
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;
}

它的使用记录:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35226592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档