распространение синтаксиса с картой не работает

1
data.map(obj => 
        {person_name: obj.user.name,
        ...obj})

Почему код выше не прошел?

мои данные выглядят так

[{user:{name:'hello'},age:1},{user:{name:'world'},age:1,{user:{name:'another_name'},age:1]

Я хочу "вытащить" obj.user.name из вложенного объекта.

Теги:
ecmascript-6

5 ответов

0
Лучший ответ

С babel вы можете использовать синтаксис (параметры) для отдыха ... для получения остальной части объекта и сохранения свойства имени напрямую.

var data = [{ user: { name: 'hello' }, age: 1 }, { user: { name: 'world' }, age: 1 }, { user: { name: 'another_name' }, age: 1 }];

console.log(data.map(({ user, ...obj }) => Object.assign(obj, { person_name: user.name })));
.as-console-wrapper { max-height: 100% !important; top: 0; }
  • 0
    Вы, кажется, не используете параметры отдыха здесь?
  • 0
    @FelixKling, ...obj считается?
Показать ещё 2 комментария
1

Вы не можете распространять такой объект (бросает SyntaxError на ...

Я бы написал его с помощью Object.assign:

data.map(obj => Object.assign({person_name: obj.user.name}, obj ));
  • 0
    Почему нет? Я не получаю никакой ошибки с этим.
  • 0
    Какие пресеты вы используете для транспиляции? babeljs с es2017 по-прежнему выдает синтаксическую ошибку
Показать ещё 3 комментария
1

Попробуй это:

data.map(obj => ({person_name: obj.user.name,...obj}))

{ В начале объекта интерпретировался как начало блока вместо объекта.

Вы можете узнать больше об этом на MDN

EDIT: Как отметил Павелл, использование оператора распространения с объектами не работает с чистым es6, вам нужно использовать конкретное преобразование, как в этом предложении: https://github.com/tc39/proposal-object-rest-pread

  • 0
    Но тогда вы все равно получаете синтаксическую ошибку в ...
  • 0
    @pawel Я предполагал, что он перемещается, используя преобразование распространения объекта, предложенное для es7. В противном случае проблема не будет конкретной карты.
0

Прежде всего, если вы хотите создать объект с помощью функции стрелки, вам нужно обернуть фигурные скобки в скобках:

data.map(obj => ({ foo: 'bar' }));

В противном случае JS считает, что фигурные скобки являются телом функции, и вы получаете синтаксическую ошибку.

Во-вторых, вы не можете использовать оператор спреда в объектных литералах. Его можно использовать только при вызове функции, используя литерал массива или при деструктуризации.

0

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

const data = [{user: {name: 'hello'},age: 1}, {user: {name: 'world'},age: 1},{user: {name: 'another_name'},age: 1}];
const result = data.map(obj => {
  return {
    person_name: obj.user.name,
    age: obj.age
  };
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Ещё вопросы

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