#javascript #html #arrays #reactjs #json
Вопрос:
Я создал массив JavaScript, содержащий некоторые другие объекты. подобъекты содержат массивы. Теперь я хочу повторить весь родительский объект в React. Я использую следующий подход, но он не работает:
Массив
const users =[ { id:1, username: "user1", path: "/user", listItems: {lists:["list-1", "List-2", "List-3", "List-4", "List-5"], path: ["/list-1", "/List-2", "/List-3", "/List-4", "/List-5"]} }, { id:2, username: "user2", path: "/user2", listItems: {lists:["list-1", "List-2", "List-3", "List-4", "List-5"], path: ["/list-1", "/List-2", "/List-3", "/List-4", "/List-5"]} }, { id:3, username: "user3", path: "/user3", listItems: {lists:["list-1", "List-2", "List-3", "List-4", "List-5"], path: ["/list-1", "/List-2", "/List-3", "/List-4", "/List-5"]} } ]
Компонент usersInfo
export default function usersInfo(props){ const users = props.users; return( lt;div className="container"gt; {users.map((item)=gt;{ return( lt;section className="user"gt; lt;h1gt;{item.username}lt;/h1gt; lt;pgt;{item.path}lt;/pgt; lt;Link href={item.path}gt;Visitlt;/Linkgt; lt;pgt;Users listslt;/pgt; lt;ulgt; {item.listItems.map((topic)=gt;{ lt;Link href={topic.path}lt;ligt;{topic.lists}lt;/ligt; })} lt;/ulgt; lt;/sectiongt; )})} lt;/divgt; )}
Использование usersInfo
сопонента в React:
lt;usersInfo users = {users}/gt;
Все работает нормально. Но у меня возникает проблема при попытке отобразить listItems
объект, который содержит два массива lists
и path
. Как мне решить эту проблему?
Я ожидаю такой результат:
Ответ №1:
ты скучаешь по этому,
замените это, это неправильно .map() здесь не будет работать, так как listItems
его объект json, вам нужно изменить этот код,
lt;ulgt; {item.listItems.map((topic)=gt;{ lt;Link href={topic.path}lt;ligt;{topic.lists}lt;/ligt; })} lt;/ulgt;
замените на это, это будет работать
lt;ulgt; { item.listItems.lists.map((list)=gt;{ lt;ligt;{list}lt;/ligt; }) item.listItems.path.map((topic)=gt;{ lt;Link href={topic.path}lt;ligt;{topic.lists}lt;/ligt; }) } lt;/ulgt;
Ответ №2:
Вы пытаетесь использовать метод карты для объекта. карта является методом массива и недоступна для объекта. Object.keys.map
должен решить эту проблему.
export default function usersInfo(props){ const users = props.users; return( lt;div className="container"gt; {users.map((item)=gt;{ return( lt;section className="user"gt; lt;h1gt;{item.username}lt;/h1gt; lt;pgt;{item.path}lt;/pgt; lt;Link href={item.path}gt;Visitlt;/Linkgt; lt;pgt;Users listslt;/pgt; lt;ulgt; {Object.keys(item.listItems)[0].map((list, i)=gt;{ lt;Link href={item.listItems.path[i]}lt;ligt;{list}lt;/ligt; })} lt;/ulgt; lt;/sectiongt; )})} lt;/divgt; )}
Комментарии:
1. Никакой ошибки. Но ничего не произошло!
lists
не отображается в браузере.
Ответ №3:
Если гарантируется, что lists
и paths
индексы совпадают, и вы хотите, чтобы ваши lt;ligt;
элементы содержали ссылки, вы можете просто сделать:
lt;ulgt; {item.listItems.lists.map((listItem, listIndex)=gt;{ return(lt;ligt;lt;Link href={item.listItems.path[listIndex]}gt;{listItem}lt;/Linkgt;lt;/ligt;); })} lt;/ulgt;
Комментарии:
1. У меня ошибка с вашим кодом. Ошибка заключается в следующем: **Ошибка типа: **
item.listItems.map is not a function
2. Теперь ошибки нет. Но
lists
они не отображаются в браузере.3. Пожалуйста, позвольте мне сказать вам, что этот код отлично работает
{item.listItems.map((topic) =gt; (lt;ligt;{topic}lt;/ligt;))}
, если у меня внутри объекта только один массив. НапримерlistItems: ["list-1", "List-2", "List-3", "List-4", "List-5"]
.Но когда я создаюlistItems
объект, подобный которому содержит два массиваlists
, иpath
такой, как этотlistItems: {lists:["list-1", "List-2", "List-3", "List-4", "List-5"], path: ["/list-1", "/List-2", "/List-3", "/List-4", "/List-5"]}
, я получаю ошибку!4. Каково на самом деле ожидаемое поведение? Вы хотите, чтобы каждый
list
элемент отображался отдельно с соответствующимpath
элементом?5. Я отредактировал вопрос и прикрепил ожидаемый вывод HTML в виде изображения.