Это кажется таким простым в моей голове, но я не могу получить правильный результат. Все, что я пытаюсь сделать, - это запустить список данных и назначить свойство объекта другому объекту
{
Foo: {
firstname: "sally",
lastname: "jenkins"
},
Bar: {
firstname: "john",
lastname: "smith"
}
}
однако с этим кодом каждому элементу объекта присваиваются одинаковые значения.
let formInfo = {}
let spriteAndId = {}
forms.forEach((form) => {
spriteAndId["id"] = parseInt(form.pokemon.url.substr(form.pokemon.url.length - 6), 10);
spriteAndId["url"] = spriteUrlGen(spriteAndId["id"]);
formInfo[form.pokemon.name] = spriteAndId;
})
Я прошу прощения, если это трудно понять, но все, что он делает, это присвоить URL-адрес (https://example.com) и id (1234) для пустого объекта spriteAndId. Переменные формы - это массив с уже имеющимися данными.
Если я запишу spriteAndId в цикле, я получаю правильный вывод с новыми значениями на каждой итерации, но, похоже, он просто присваивает только один из этих итераций каждому элементу родительского объекта.
Я подумал, что, может быть, я не понял forEach достаточно хорошо, поэтому я реализовал его с помощью цикла for и получил тот же результат. Я не могу окутать голову, почему он присваивает один и тот же объект всем значениям formInfo.
Надеюсь, кто-то может пролить свет на то, что мне здесь не хватает. Заранее спасибо!
const formInfo = Object.keys(form)
.map(obj => ({
[form[obj].name]: {
id: form[obj].id,
sprite: spriteUrlGen(form[obj].id)
}
}))
.reduce((prev, curr) => ({ ...prev, curr }, {}))
Если я понял, что вы пытаетесь достичь, это конечный объект формы с именем покемона в качестве ключа и данных (спрайт и идентификатор) в качестве значения. Object.keys() возвращает массив всех свойств объекта. Вы можете отображать их и преобразовывать данные, в этом случае мы возвращаем объект с именем pokemon в качестве ключа и id, sprite в качестве значений. Обратите внимание на []
которые заключают в себе ключ объекта, что делает значение динамическим, иначе, если вы напишете hardcode, ключ не будет работать. Теперь все эти значения были отображены/преобразованы в объекты, функции сокращения принимают их все и заключают в один объект, начиная с {}
пустого объекта
spriteAndId
внутрь цикла.