#javascript #object
#javascript #объект
Вопрос:
Я пытаюсь создать список из объекта в React. Прежде чем продолжить, я поделюсь своим кодом:
const genres = {
Rock: {
album1: '',
album2: '',
},
Jazz: {
album1: '',
album2: '',
},
Pop: {
album1: '',
album2: '',
}
};
let myFunc = genress => {
let newObject = {};
Object.keys(genress).map(gen => {
newObject[gen] = 'a';
let newChild = newObject[gen];
let oldChild = genress[gen];
Object.keys(oldChild).map(gen2 => {
newChild[gen2] = 'b';
let newGrandChild = newChild[gen2];
console.log(newGrandChild);
})
});
return newObject;
}
myFunc(genres);
Я хочу отобразить этот объект в списке.
<ul>
<li>Rock
<ul>
<li>album1</li>
<li>album2</li>
</ul>
</li>
</ul>
...And so on
Прежде чем поместить его в React, я пытаюсь использовать его в обычной функции. Я создаю новый объект, просто чтобы убедиться, что я получаю правильные значения. Проблема в том, что когда я возвращаю новый объект в конце функции, он возвращает жанры, но не альбомы, только ‘a’, который я установил в первом Object.key. Консоль.войдите во второй объект. ключевые журналы не определены и не могут понять, почему это происходит.
Моя идея состоит в том, чтобы иметь доступ к каждому уровню объекта, чтобы я мог установить для них переменные и возвращать их в компоненте рендеринга. Я сделаю больше уровней: Жанры -> Группы -> Альбомы -> песни.
Заранее большое спасибо 🙂
Комментарии:
1. Пожалуйста, укажите ожидаемую структуру объекта после преобразования.
2. На самом деле это один и тот же объект. Поскольку я хочу сохранить каждый уровень в переменной, чтобы отобразить его в react, новый объект — это просто способ убедиться, что я правильно выполняю итерацию по объекту.
3. Если это один и тот же объект, вам не нужен код
Ответ №1:
Насколько я понимаю, вы неправильно перебираете объект.
Причина, по которой ‘a’ — это единственное, что появляется, заключается в том, что вы жестко кодируете это каждый раз, когда запускаете цикл, и устанавливаете для текущего ключа это значение.
Таким образом, по сути, ваш код не работает, потому что вы устанавливаете значение текущего ключа равным ‘a’, которое является строкой, поэтому в ‘a’ нет ключей, поэтому второй цикл ничего не производит.
newObject[gen] = 'a'; // you are setting obj[Rock]='a'
let newChild = newObject[gen]; // this is just 'a'
let oldChild = genress[gen]; // this is just 'a'
Object.keys(newObject[gen]) // undefined
Я думаю, что вы пытаетесь выполнить итерацию по объекту, а затем отобразить содержимое этого объекта в списке.
Дайте мне знать, если приведенное ниже ответит на ваш вопрос.
Вы можете увидеть, как работает код здесь: https://codesandbox.io/s/elastic-dhawan-01sdc?fontsize=14amp;hidenavigation=1amp;theme=dark
Вот пример кода.
import React from "react";
import "./styles.css";
const genres = {
Rock: {
album1: "Hello",
album2: "Rock 2"
},
Jazz: {
album1: "",
album2: ""
},
Pop: {
album1: "",
album2: ""
}
};
const createListFromObject = (key) => {
return (
<div>
<h1>{key}</h1>
<ul>
{Object.entries(genres[key]).map(([k, v], idx) => (
<li key={`${key}-${k}-${v}-${idx}`}>{`Key: ${k} Value ${v}`}</li>
))}
</ul>
</div>
);
};
export default function App() {
return (
<div className="App">{Object.keys(genres).map(createListFromObject)}</div>
);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
Комментарии:
1. Это именно то, что я искал! Большое вам спасибо 🙂 Причина, по которой я установил ‘a’ в первом цикле, заключалась в том, чтобы перезаписать его позже в следующем цикле, но пока просто что-то есть. Мне действительно интересно, почему в первом Object.key я могу установить newObject[gen] = ‘a’, но во втором я не могу установить newChild[gen2] = ‘b’ . В любом случае, еще раз спасибо за вашу помощь 🙂
2. Ну, вероятно, потому, что вы пытаетесь обновить строку. пусть newChild = newObject[gen]; равно ‘a’ . Итак, затем в функции map вы пытаетесь установить newChild[‘album’], что ничего не значит, потому что [‘album’] не определено. Я думаю, что если вы хотите обновить какое-то значение, вам нужно будет создать newObject[gen] = {} newObject[gen][‘a’]={}
3. Это имеет смысл, я буду иметь это в виду. Еще раз спасибо за ваш ответ!