假设...
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
属性,但这很麻烦。我正在寻找优雅的东西。
答案 0 :(得分:4)
您可以使用Array.map()和对象销毁:
let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
let result = A.map(({y,...rest})=> ({...rest,v:y}));
console.log(result);
答案 1 :(得分:3)
您可以重命名属性,并使用对象的其余语法来获取所有其他属性。对于映射,请使用其余参数和新属性。
let A = [{ x: 'x', y: 'y' }, { x: 'x', y: 'y' }];
console.log(A.map(({ y: v, ...o }) => ({ ...o, v })));
答案 2 :(得分:1)
我知道您说过您知道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)
答案 3 :(得分:0)
这种方法提供了一种 硬编码 的方式,可以将密钥转换为新密钥。另一方面,此[mapping[k]]
被称为Computed property names
。
同样,函数Array.prototype.reduce
根据mapping
和特定对象本身来构建所需的对象。
重要: 函数Array.prototype.map
正在创建一个新的Array,基本上是不修改/变异原始数组。 < / p>
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; }