【问题标题】:Clone a object only with few properties仅克隆具有少量属性的对象
【发布时间】:2017-02-05 09:02:02
【问题描述】:

有没有办法在 JS 中克隆一个只有少数对象属性的对象? 比如……

var Person = {
    name: "Bob",
    age: 32,
    salary: 20000
};

我必须创建另一个仅包含 name 和 age 属性的 person 对象,以便它看起来像这样:

var clonedPerson = {
    name: "Bob",
    age: 32
};

我可以对对象进行深度克隆并删除。但我想知道是否有更好的方法。

【问题讨论】:

  • 你可以只检查旧对象的属性,只复制你想要的。
  • 如果你不想使用delete,你必须定义一个只有你想要的属性的新对象。没有用于复制仅具有所需属性的对象的本机方法。
  • var clonedPerson = { name: Person.name }
  • @adeneo 仅适用于字符串,如果您使用内部包含对象的属性执行此操作,它将引用,而不是克隆
  • @user2415266 - 我在 OP 的示例中只看到原语

标签: javascript jquery object clone


【解决方案1】:

使用最新的ES6,可以通过以下代码实现。

const Person = {
  name: "Bob",
  age: 32,
  salary: 20000
};
const { salary , ...clonedPerson } = Person

console.log(clonedPerson)

【讨论】:

  • 这看起来是一个优雅的解决方案。不幸的是,我没有使用 ES6。
【解决方案2】:

更简单?

var Person = {
    name: "Bob",
    age: 32,
    salary: 20000
};
var ClonedPerson = jQuery.extend({}, Person);
delete ClonedPerson.salary;

console.log(JSON.stringify(Person));
console.log(JSON.stringify(ClonedPerson));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • OP 说,“我可以对对象进行深度克隆并删除。但我想知道是否有更好的方法。” 不过,你'重新使用delete ?
  • 我当时想的很简单,只是想确认一下。具有讽刺意味的是,你暴露了一个更好的方法...... :)
  • @MarcosSedrez 谢谢.. 但是是的.. 正如 Pranesh 提到的.. 我想知道是否有任何替代方法。
【解决方案3】:

使用数组成员方法的另一种方法:

var clone = Object.keys(Person) // convert to an Array of Person keys
            .filter(function(key){return ["salary"].indexOf(key) == -1;}) // exclude key salary
            .reduce(function(clone, current){clone[current] = Person[current]; return clone;}, {}); // convert back the array to a cloned literal object

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2016-08-05
    • 2015-08-20
    • 2015-02-08
    • 2012-12-12
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多