Элегантный способ преобразования определенных имен свойств в карту массива - PullRequest
0 голосов
/ 01 ноября 2018

Пусть ...

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 голосов
/ 01 ноября 2018

Этот подход обеспечивает менее жестко запрограммированный способ преобразования ключей в новые. С другой стороны, это [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; }
0 голосов
/ 01 ноября 2018

Вы можете переименовать свойство и использовать синтаксис rest для объекта, чтобы получить все остальные свойства. Для отображения возьмите оставшиеся параметры и новое свойство.

let A = [{ x: 'x', y: 'y' }, { x: 'x', y: 'y' }];

console.log(A.map(({ y: v, ...o }) => ({ ...o, v })));
0 голосов
/ 01 ноября 2018

Я знаю, вы сказали, что знали, что могли бы 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)
0 голосов
/ 01 ноября 2018

Вы можете использовать Array.map () и уничтожение объектов:

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];

let result = A.map(({y,...rest})=> ({...rest,v:y}));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...