【问题标题】:lodash: deep copy object but not all propertieslodash:深拷贝对象,但不是所有属性
【发布时间】:2016-04-13 16:29:53
【问题描述】:

有没有办法用lodash复制一个对象,但不是所有的属性。 我知道的唯一方法是逐个属性手动复制它

想要例如:

var obj = {
    a: 'name',
    b: [1,2,3],
    c: {
        z: 'surname',
        x: []
    },
    d: {
        y: 'surname2',
        w: []
    }
};

结果是这样的

var copy_obj = {
    b: [1,2,3],
    c: {
        z: 'surname',
        x: []
    }
};

编辑: 我最终选择了:

var blacklist = ['a','d'];
_.cloneDeep(_.omit(obj, blacklist));

【问题讨论】:

  • 查看pickomit
  • 如果您自己解决了问题,请将其作为答案,而不是对问题的编辑。如果你愿意,你可以接受那个答案。

标签: javascript lodash


【解决方案1】:

omit 几乎可以达到这个目的:

_.cloneDeep(_.omit(obj, blacklist));

在这里提琴:https://jsfiddle.net/c639m9L2/

【讨论】:

  • 来自 Lodash 文档的注释:“这种方法 [即 _.omit] 比 _.pick 慢得多。”
  • 有人可以在上面添加这个 _.clonedeep..., var blacklist = ['a','d'];这是一个非常重要的行,队列编辑请求已满
【解决方案2】:

您可以使用pick 函数:

_.pick(obj, 'b', 'c')

【讨论】:

  • 假设 OP 想要一个深层副本,正如问题标题所建议的那样,这不会这样做。
【解决方案3】:

您可以使用JSON.stringify 的第二个参数来执行此操作。

JSON.parse(JSON.stringify(obj, ['b', 'c']))

【讨论】:

  • 不是我最喜欢的,但使用 vanilla JS 值得称赞,而其他答案都需要 lodash。
【解决方案4】:

您可以结合使用 assignpick

Object.assign(copy_obj, _.pick(obj, ['b', 'c']));

这样,如果 copy_obj 有其他属性,您不要覆盖它们。

【讨论】:

  • 展示如何保存来自copy_obj 的道具是一个公平的观点。然而,这只是来自obj 的道具的浅拷贝。如果您需要它们的深层副本,您也需要使用_.deepClone。 IE。 Object.assign(copy_obj, _.deepClone(_.pick(obj, ['b', 'c'])));
【解决方案5】:
var blacklist = ['a','d'];
_.cloneDeep(_.omit(obj, blacklist));

【讨论】:

  • 你为什么逐字复制我的答案并标记为正确?
  • @Chris:公平地说,your answer 是从 4 月 14 日开始的,而 OP 已经在 4 月 13 日编写了这段代码(作为edit to the question),然后可能会复制 那个 sn-p 进入一个新的答案(由a commenter 建议)。
  • 公平,只是看起来很奇怪。很好奇他是否在他的答案中发现了一些使它更正确的东西 - 对于这个问题/答案的未来读者
猜你喜欢
  • 2015-09-14
  • 2023-03-31
  • 2012-03-23
  • 1970-01-01
  • 2011-09-16
  • 2014-01-10
  • 1970-01-01
  • 2012-06-19
  • 2019-11-17
相关资源
最近更新 更多