Предполагать...
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 destructing:
let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
let result = A.map(({y,...rest})=> ({...rest,v:y}));
console.log(result);
Вы можете переименовать свойство и использовать синтаксис остатка для объекта, чтобы получить все остальные свойства. Для отображения возьмите отложенные параметры и новое свойство.
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; }