假设。。。
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; }