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

时间:2018-11-01 20:03:17

标签: 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' }]

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

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

我知道我可以在胖箭头功能上使用功能块,添加v属性,然后删除y属性,但这很麻烦。我正在寻找优雅的东西。

4 个答案:

答案 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; }