Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换数组映射中某些属性名称的优雅方法_Javascript_Arrays_Ecmascript 6 - Fatal编程技术网

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的建议