【问题标题】:Cloning object with specific properties from object in javascript?从javascript中的对象克隆具有特定属性的对象?
【发布时间】:2018-12-26 07:19:08
【问题描述】:

从具有特定属性而不是全部属性的另一个对象克隆一个对象的优化方法是什么?

如下所示,我们可以通过投影从对象中获取值:

let tempObject = { 
  prop1 : 'something',
  prop2 : 'something' ,
  other : 'others'
};
//then
let { prop1, prop2} = tempObject;

我想从另一个对象克隆一些属性,例如

let oldObject = { 
  p1 : 'something',
  p2 : 'somethig',
  p3 : 'something' 
}

想要从上面的 oldObject 创建另一个对象,只有 p1 and p2 这两个属性。 预计 newObject 将是 {p1 : 'something', p2 : 'somethig'}

我知道有很多方法可以做到这一点,但我想知道带有解释的优化方法。

【问题讨论】:

  • “优化”如何?运行速度?代码清晰?简洁吗?
  • @T.J.Crowder 感谢您提出的过于具体的问题?是的,我首先关心的是运行时速度
  • 你真的要在一个紧密的循环中这样做数十万次吗?建议先编写清晰的代码,如果您在某个时候遇到了性能问题,并且您已经确定这是由于这个问题(这似乎不太可能),然后解决它.
  • 我已经完成了清晰的代码,就像我使用基本方式一样。但是好奇心!

标签: javascript object clone


【解决方案1】:

我会保持简单:

let newObject = {
    p1: oldObject.p1,
    p2: oldObject.p2
};

这也将非常非常快,正如您所评论的那样,您在考虑性能方面。

你可以用循环使它复杂化:

let newObject = {};
for (const name of ["p1", "p2"]) {
    newObject[name] = oldObject[name];
}

或者使用 property rest(ES2018,在现代浏览器中,并且现在由转译器支持很长时间),您可以复制除您命名的之外的所有内容:

let {p3, ...newObject} = oldObject;

但在大多数情况下,我会保持简单。

【讨论】:

  • @ibrahimmahrir - 很好的发现。 OP 似乎专注于性能,而专注于优雅,但是……这是一个非常细微的区别。 :-)
  • 是的,我刚刚看到他的评论。
  • 第二种方法很棒,但我没有使用 ES2018。喜欢那个。
【解决方案2】:

您可以使用lodash 仅选择与_.pick 相关的属性,如下所示:

_.pick(oldObject, ["p1", "p2"])

您可以在此处查看工作版本:https://jsfiddle.net/W4QfJ/19493/

或者看看:Filter object properties by key in ES6

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 2012-12-12
    • 1970-01-01
    • 2017-02-05
    • 2016-08-05
    • 2015-08-20
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多