是否有一种快速的方法将属性从对象移到新对象?

时间:2018-07-29 12:41:46

标签: javascript ecmascript-6

具有与以下功能相同的效果:

const obj = {a:'a', b:'b', c:'c'};
const {a, b} = obj;
const result = {a, b};

或者,在ES5中:

const obj = {a:'a', b:'b', c:'c'};
const result = Object.keys(obj)
    .filter((key) => ['a', 'b', 'c'].includes(key))
    .reduce((acc, key) => acc[key] = obj[key], {})

我想

const result = { a, b } = obj;

可以工作,但是显然,它具有以下效果:

const result = obj;

,因为result具有obj的所有属性,并且似乎也指向它(result.a = 'changed'导致obj.a === changed为真)。这是一个错误吗?

3 个答案:

答案 0 :(得分:0)

const result = {...obj}

那行得通吗?这不是深度复制,但您的第一个示例也不是。

答案 1 :(得分:0)

要克隆Object,使其指向不同的内存位置,即对其中一个克隆所做的更改不会影响另一个,则可以使用:

1- Object.assign()

const result = Object.assign({}, obj);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

2.-传播算子(在ES6中):

const result = {...obj};

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

答案 2 :(得分:0)

您可以排线

const result = { a, b } = obj;
正如其他人所说,

以看起来像您打算的方式工作,它使用obj的深层副本而不是引用obj本身。一种执行此操作的方法可能是您正在寻找的“快速衬板”

const result = (({ a, b }) => ({ a, b }))(JSON.parse(JSON.stringify(obj)));

JSON.parse(JSON.stringify(obj))仅提供obj的深层副本。因此,result的更改不会影响obj,反之亦然。

const obj = {a:'a', b:'b', c:'c'};
const result = (({ a, b }) => ({ a, b }))(JSON.parse(JSON.stringify(obj)));
console.log(result);//expected output: Object { a: "a", b: "b" }

result.a = 'changed';
console.log(result);//expected output: Object { a: "changed", b: "b" }
console.log(obj);//expected output: Object { a: "a", b: "b", c: "c" }

这种深层复制方法的一些性能信息在this SO answer中共享,并且该线程有一些替代方法。

对象解构语法的语法说明可以在this SO answer中找到。