Javascript 惯用ES6/ES6下一个克隆对象的方法是使用不同的键将一个项替换为另一个项?
如果我想在使用相同的键替换添加的新项目或用新项目替换项目的同时不发生突变地对对象进行浅克隆,我知道我可以使用Javascript 惯用ES6/ES6下一个克隆对象的方法是使用不同的键将一个项替换为另一个项?,javascript,ecmascript-6,clone,javascript-objects,ecmascript-next,Javascript,Ecmascript 6,Clone,Javascript Objects,Ecmascript Next,如果我想在使用相同的键替换添加的新项目或用新项目替换项目的同时不发生突变地对对象进行浅克隆,我知道我可以使用object.assign() 但是如果我想用baz:50替换bar:20,该怎么办 我知道我可以使用delete ob[bar],但这是变异,我想避免 是否有一种简洁的函数式编程方法可以通过较新的ES6/ES7/Babel功能实现这一点 正如@FelixKling在评论中所提到的,在已经克隆的对象上使用delete obj.key将是最简单的解决方案,对于不变性的概念来说,这是非常好的
object.assign()
但是如果我想用baz:50
替换bar:20
,该怎么办
我知道我可以使用delete ob[bar]
,但这是变异,我想避免
是否有一种简洁的函数式编程方法可以通过较新的ES6/ES7/Babel功能实现这一点
正如@FelixKling在评论中所提到的,在已经克隆的对象上使用delete obj.key
将是最简单的解决方案,对于不变性的概念来说,这是非常好的
但是如果您想要一个更“复杂”的解决方案,您可以使用它来克隆对象并删除所需的属性
const l=console.log;
功能移除(o,p){
常数{[p]:未定义,…props}=o;
返回道具;
}
const obj={someProp:'someValue',originalProperty:'originalValue'};
l('remove:\n',remove(obj,'originalProperty'));
l('原始对象:\n',obj)
您愿意使用lodash吗?似乎您可以使用.transform
ES2015+和ES.next。在ES7发布之前,术语ES7用于实验特性。但是现在使用这个术语是没有意义的。@hippietrail:对克隆对象进行变异是完全正确的。你不应该改变现有值/当前状态。当然。。。但从长远来看,清晰、简单的解决方案比“聪明”的解决方案要好;)但是我想替换这个属性,而不仅仅是移除它。显然,我们可以通过组合使用省略和对象赋值来实现这一点。我想知道是否有一行程序?在我的答案中添加了一个简单的替换函数。FWIW你可以做函数替换(o,p,n,v=o[p]){}
而不是const rv=v!==未定义?v:o[p]代码>@FelixKling是的,刚刚添加了它。谢谢为了更好地理解,我还添加了一个较长的版本。
const oldOb = { foo:10, bar:20 };
const newOb = Object.assign({}, oldOb, { bar:100 });