Доступ к свойствам другого объекта внутри другого объекта

#javascript

Вопрос:

У меня есть фиктивный ответ api, состоящий из массива результатов, в котором есть объекты. Когда я пытаюсь сопоставить этот массив и пытаюсь получить доступ к свойствам каждого отдельного объекта внутри другого создаваемого мной объекта, он выдает ошибку. Есть идеи, что может быть не так?

вот фрагмент кода

 import { result } from "./partnership_rewards_response.json";

result.map((partner,index)=>{
    const obj = {
        partner.name,
        partner.class
    }
})
 

и вот как выглядит мой файл json

 {
"result":[obj1, obj2, ...]
}
 

и ошибка, которую я получаю, заключается в том, что Parsing error: Unexpected token, expected ","

РЕДАКТИРОВАТЬ: Я забыл указать, я пытаюсь заполнить содержимое в react с помощью useState. таким образом, структура объекта уже инициализирована в значении по умолчанию

EDIT2: вот как я пытаюсь его заполнить

 const [showModal, setModal] = useState(false);
const [modalContent, setModalContent] = useState({
    partner_name: "",
    coupon_image:"",
    coupon_code : "",
    coupon_content:"",
    terms:"",
    redemption_steps:"",
});

setModalContent(
{
partner.partner_logo,
partner.coupon_image
}
)
 

Ответ №1:

Проблема в том, что вы пытаетесь использовать сокращенную запись свойств в литерале объекта , но вы можете это сделать только в том случае, если источником значения свойства является простой идентификатор, например example , а не выражение свойства, например person.name . Если источником значения является не просто идентификатор, вместо него необходимо использовать «старый» (до ES2015) синтаксис полного свойства ( name: value ).

Вам нужно явно указать имя свойства:

 result.map((partner,index)=>{
    const obj = {
        name: partner.name,
        class: partner.class,
    };
    // ...I assume there's more here...
})
 

или повторно отредактируйте (сбивает с толку то, что вы изменили имена свойств):

 setModalContent({
    partner_logo: partner.partner_logo,
    image: partner.image,
});
 

Вы также можете сделать это с помощью деструктурирования и сокращенной записи свойств:

 result.map(({name, class},index)=>{
    const obj = {
        name,
        class,
    };
    // ...I assume there's more here...
})
 

или повторно отредактируйте, если вы разрушили person , вы могли бы сделать:

 setModalContent({
    partner_logo,
    image,
});
 

Комментарии:

1. пожалуйста, посмотрите правку, я пытаюсь заполнить содержимое с помощью этого, мне все еще нужно указывать имена свойств?

2. @Altair21 — Боюсь, я не понимаю правку; код может сделать ее более понятной. По сути, не имеет значения, что вы делаете с объектом, вам нужно создать его с допустимым синтаксисом. { person.name, person.class } не является допустимым инициализатором объекта, но { name: person.name, class: person.class } и { name, class } (если вы используете решение для деструктурирования) являются.

3. О, спасибо за разъяснение

4. @Altair21 — Я сделал это в первом предложении ответа, но, возможно, недостаточно четко; Я расширил этот первый абзац.

5. Спасибо за информацию. это многое объясняет для меня

Ответ №2:

Синтаксис сокращенных объектов не работает, потому что в именах ключей есть точки.

Вы можете изменить его на что-то вроде:

 import { result } from "./partnership_rewards_response.json";

result.map((partner,index)=>{
    const obj = {
        partnerName: partner.name,
        partnerClass: partner.class
    }
})
 

Комментарии:

1. пожалуйста, посмотрите правку, я пытаюсь заполнить содержимое с помощью этого, мне все еще нужно указывать имена свойств?

2. Можете ли вы показать код, определяющий структуру объекта?

3. Пожалуйста, ознакомьтесь с правкой

4. Затем инициализируйте свой объект как { partner_name: partner.name, etc . Но я не вижу здесь partner_class.

5. это был просто пример, я не следил за точными названиями свойств, но я сделаю это, спасибо

Ответ №3:

ваш синтаксис стенографии неверен измените свой код на этот

 result.map((partner,index) => {
 const obj = {
     name : partner.name,
     class : partner.class
  }
})
 

Это должно сработать