Javascript 转换数组映射中某些属性名称的优雅方法
假设Javascript 转换数组映射中某些属性名称的优雅方法,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,假设 let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }]; 我知道我可以将这个数组转换成一个新数组,并像这样重命名y属性 A.map(o => ({ v: o.y })); // [{ v:'y' }, { v:'y' }] A.map(o => ({ ...o, ...{ v: o.y } })); // [{ x:'x', y:'y', v:'y' }, { x:'x', y:'y', v:'y' }] 我可以使用一个排列来获得所有现有
let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
我知道我可以将这个数组转换成一个新数组,并像这样重命名y
属性
A.map(o => ({ v: o.y }));
// [{ v:'y' }, { v:'y' }]
A.map(o => ({ ...o, ...{ v: o.y } }));
// [{ x:'x', y:'y', v:'y' }, { x:'x', y:'y', v:'y' }]
我可以使用一个排列来获得所有现有的属性,再加上一个新的,经过改造的属性,就像这样
A.map(o => ({ v: o.y }));
// [{ v:'y' }, { v:'y' }]
A.map(o => ({ ...o, ...{ v: o.y } }));
// [{ x:'x', y:'y', v:'y' }, { x:'x', y:'y', v:'y' }]
但是我想知道是否有一种优雅的方法可以简单地将y
属性重命名为v
。这就是我想要的
// [{ x:'x', v:'y' }, { x:'x', v:'y' }]
我知道我可以在fat-arrow函数中使用函数块,添加v
属性,删除y
属性,但这很麻烦。我正在寻找优雅的东西。您可以使用Array.map()和对象销毁:
设A=[{x:'x',y:'y'},{x:'x',y:'y'}];
设result=A.map(({y,…rest})=>({…rest,v:y}));
控制台日志(结果)代码>您可以重命名该属性并使用对象的rest语法来获取所有其他属性。对于映射,使用rest参数和新属性
设A=[{x:'x',y:'y'},{x:'x',y:'y'}];
log(A.map(({y:v,…o})=>({…o,v}))代码>我知道你说过你知道你可以删除
,但如果你想改变对象的位置,这并不一定是不雅的:
设A=[{x:'x',y:'y'},{x:'x',y:'y'}];
forEach(o=>delete Object.assign(o,{v:o.y}).y)
log(A)
这种方法提供了一种较少的硬编码方式,可以将密钥转换为新的密钥。另一方面,调用此[mapping[k]]
同样,该函数根据映射和特定对象本身构建所需对象
重要提示:该函数正在创建一个新数组,基本上不是修改/变异原始数组
设A=[{x:'x',y:'y'},{x:'x',y:'y'}];
映射={'y':'v'},
result=A.map(o=>Object.keys(o).reduce((A,k)=>{
if(映射中的k)返回Object.assign(a,{[mapping[k]]:o[k]});
返回Object.assign(a,{[k]:o[k]});
},Object.create(null));
控制台日志(结果)代码>
作为控制台包装{max height:100%!important;top:0;}
如何量化“优雅”?您用ecmascript-6标记了这个问题。请注意,“排列属性”不是ES6的一部分。优雅=您看到它时就知道它;)另外,由于大多数JavaScript引擎中的删除触发字典模式,这将降低大型集合上的性能。在小场景中,这显然不是问题。这很有趣@TravisJ,谢谢-我不知道。这让我对@TravisJ感到好奇,所以我找到了指向它的地方。在测试中,delete
在Safari中的速度明显较慢,但在Chrome中的性能基本相同。我想知道最近对V8的更改是否使这一点变得不那么重要了。它仍然使用delete,性能是一样的。请参见第16版的erfr,以进行比较,无需删除。速度快了32%,绝对是我想要的。谢谢你。@JeremyFoster很高兴帮助你:-)我更喜欢这个,而不是@amrender singh的建议