在数组映射中转换某些属性名称的优雅方式



假设。。。

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' }]

但我想知道是否有一种优雅的方法可以简单地将y属性重命名为v。这就是我想要的。

// [{ x:'x', v:'y' }, { x:'x', v:'y' }]

我知道我可以在胖箭头函数上使用函数块,添加v属性,并删除y属性,但这很麻烦。我在找高雅的东西。

您可以使用Array.map((和Object destruction:

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
let result = A.map(({y,...rest})=> ({...rest,v:y}));
console.log(result);

您可以重命名属性,并使用对象的rest语法来获取所有其他属性。对于映射,请使用已休息的参数和新属性。

let A = [{ x: 'x', y: 'y' }, { x: 'x', y: 'y' }];
console.log(A.map(({ y: v, ...o }) => ({ ...o, v })));

我知道你说过你知道你可以delete,但如果你想在适当的位置更改对象,这并不一定是不雅的:

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
A.forEach(o => delete Object.assign(o, {v: o.y }).y)
console.log(A)

这种方法提供了一种较少的硬编码方法来将密钥转换为新密钥。另一方面,这个[mapping[k]]被称为Computed property names

同样,函数Array.prototype.reduce是根据mapping和特定对象本身来构建期望的对象。

重要信息: 函数Array.prototype.map创建一个新数组,基本上不是修改/更改原始数组

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
mapping = {'y': 'v'},    
result = A.map(o => Object.keys(o).reduce((a, k) => {
if (k in mapping) return Object.assign(a, {[mapping[k]]: o[k]});
return Object.assign(a, {[k]: o[k]});
}, Object.create(null)));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新