ES6 Spread Operator克隆或提取特定密钥到另一个对象

时间:2017-04-18 12:11:53

标签: javascript ecmascript-6

有没有办法克隆具有指定键的对象。例如,你有这个对象

const User = {
  firstName: '',
  lastName: '',
  age: '',
  gender: '',
  job: '',
}

您只想克隆或提取firstNamelastName以创建另一个对象,如:

const UserPublicInfo = {
  firstName,
  lastName,
}

我知道一些解决方案,但......

解决方案#1:手动

const UserPublicInfo = {
  firstName: User.firstName,
  lastName: User.lastName,
}

买者

小列表没有问题,但是对于大型列表来说这将是单调乏味的,比如10个或更多的密钥。

解决方案#2:休息运营商

我们可以使用Rest Operator

特别省略这些​​键
const { firstName, lastName, ...UserPublicInfo } = User

买者

这比第一个解决方案容易,但问题是如果你不知道User对象的属性会怎样?是的,您可以console.log内容,但如果您的开发后期团队成员更新了此User对象并决定添加其他属性,那么您的应用程序通常会在此过程中产生错误。因此,安全性Solution #1更好。

我希望它可以在下面的代码中轻松完成,但它会在我的转换器上抛出错误。

const UserPublicInfo = { firstName, lastName } = User

这个用例是否有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

您可以看到this 实施(但ES6功能)克隆,Object.Assign()的想法和Function.prototype.apply的深度克隆:

export class ClonerAssign<T> implements interfaces.ICloner{
        clone<T>(sample: T): T {
            var proto = Object.getPrototypeOf(sample);
            //soft clone
            var _new = Object.assign({}, sample, proto, Object.getPrototypeOf(proto));

            //deep clone
            var _props = props(proto).filter(x => notCoreFunc(x));
            _props.forEach(key => {
                if (typeof proto[key] === 'function') {
                    (_new as any)[key] = (...args: any[]) => {
                        (proto[key] as any).apply(_new, args);
                    };
                }
            });

            return _new;
        }
    }