有没有办法用指定的键克隆一个对象。例如你有这个对象
const User = {
firstName: '',
lastName: '',
age: '',
gender: '',
job: '',
}
而您只想克隆或提取 firstName
和lastName
创建另一个对象,例如:
const UserPublicInfo = {
firstName,
lastName,
}
我知道一些解决方案,但是......
解决方案#1:手动
const UserPublicInfo = {
firstName: User.firstName,
lastName: User.lastName,
}
警告
小列表没有问题,但对于大列表(假设有 10 个以上的键或更多),这会很乏味。
解决方案 #2:Rest 运算符
我们可以使用 Rest Operator 专门省略键
const { firstName, lastName, ...UserPublicInfo } = User
警告
这比第一个解决方案更容易,但问题是如果您不知道 User
的属性怎么办?目的?是的,你可以console.log
内容,但如果稍后在您的开发过程中队友更新了此内容怎么办 User
对象并决定添加另一个属性,您的应用程序很可能会在此过程中引起错误。所以安全方面Solution #1
更好。
我希望它可以像下面的代码一样简单地完成,但它在我的转译器上抛出错误。
const UserPublicInfo = { firstName, lastName } = User
对于这个用例有更好的解决方案吗?
最佳答案
您可以看到this typescript克隆的实现(但具有 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;
}
}
关于javascript - ES6 Spread Operator 将特定键克隆或提取到另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471790/