Элегантный способ преобразования определенных имен свойств в карту массива

1

Предполагать...

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, но это громоздко. Я ищу что-то элегантное.

  • 3
    Как вы определяете «элегантность»?
  • 1
    Вы пометили вопрос с помощью ecmascript-6. Обратите внимание, что «свойства распространения» не являются частью ES6.
Показать ещё 1 комментарий
Теги:
ecmascript-6
arrays

4 ответа

3

Вы можете использовать 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);
  • 0
    Абсолютно то, что я искал. Спасибо.
  • 0
    @JeremyFoster Рад помочь вам :-)
2

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

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

console.log(A.map(({ y: v, ...o }) => ({ ...o, v })));
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)
  • 1
    Кроме того, это приведет к снижению производительности на больших наборах из-за удаления словарного режима в большинстве движков JavaScript. На маленьких наборах это явно не проблема.
  • 0
    Это интересно @TravisJ, спасибо - я этого не знал.
Показать ещё 2 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню