简体   繁体   English

如何使用 React 动态映射深层 JSON 数据

[英]How to map deep JSON data dynamically using React

I'm using React and Next.js, still not proficient at referencing deeper nested JSON data (if what I'm trying to do is possible).我正在使用 React 和 Next.js,但仍然不擅长引用更深层次的嵌套 JSON 数据(如果我想要做的是可能的话)。

I'm receiving (destinations) as a fetched array of objects from my JSON file which will later have the country name dynamically assigned (no problem).我正在接收(目的地)作为从我的 JSON 文件中获取的对象数组,稍后将动态分配国家/地区名称(没问题)。

What I need to do is access the keys and values nested below each city object in the array for any given country.我需要做的是访问任何给定国家/地区数组中每个城市对象下嵌套的键和值。 I'm trying to map these properties to create dynamic components.我正在尝试映射这些属性以创建动态组件。 Each city object containing an object with the keys/values needs to be referenced dynamically to assign these values to my component.每个包含带有键/值的对象的城市对象都需要动态引用以将这些值分配给我的组件。

I can't figure out how to reference the cities perhaps using a dynamic variable to access the objects they hold.我不知道如何引用城市,也许使用动态变量来访问它们持有的对象。 Note that I can change the format/structure of my JSON data if it would help me accomplish my goal, as I haven't plugged in most data yet.请注意,如果能帮助我实现目标,我可以更改 JSON 数据的格式/结构,因为我还没有插入大多数数据。

You'll find my particular issue in the middle Code section (Lower Level Component) where I have destinations.map((place) => {}) where I'm unable to access the city's, properties buried one level deeper, dynamically.您会在中间的代码部分(低级组件)中找到我的特定问题,我在那里有destinations.map((place) => {}),我无法访问城市的,动态地埋藏更深一层的属性。

Higher Level Page receiving component:高级页面接收组件:

import React, { useState, useEffect } from 'react';
import DestinationsPage from '../components/DestinationsPage';

export default function Home({ destinationData }) {
    const placeName = 'netherlands';
    console.log('destinationData:', destinationData[placeName]);

const [ destinations, setDestinations ] = useState([]);

useEffect(() => {
    setDestinations(destinationData[placeName]);
}, []);


return (
        <DestinationsPage destinations={destinations} placeName={placeName} />
);
}

export const getStaticProps = async () => {
    const response = await fetch('http://localhost:3000/data/destinations.json', {
        headers: {
            'Content-Type': 'application/json'
        }
    });
    const destinationData = await response.json();

return {
    props: {
        destinationData
    }
};
};

Lower Level Component:低级组件:

import DestinationCard from './DestinationCard';

import styles from '../styles/Destinations.module.css';

export default function DestinationsPage({ destinations, placeName }) {
return (
    <main>
        <h1 className={styles.destination_placeName}>
            {placeName} Attraction&nbsp;Guides
        </h1>

        <h2 className="destinations-list-heading">
            Destinations A&nbsp;&#8209;&nbsp;Z
        </h2>

        <section className={styles.destination_list}>
            <div className={styles.destinations_container}>
                {destinations.map((place) => {
                    const { id } = place;
                    return (
                        <DestinationCard
                            key={id}
                            {...place}
                            pageType="destinationsPage"
                        />
                    );
                })}
            </div>
        </section>
    </main>
);
}

JSON Data: JSON 数据:

{
"netherlands": [
    {
        "amsterdam": {
            "id": "amsterdam",
            "destination": "Amsterdam",
            "page_url": "/destinations/europe/netherlands/amsterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Amsterdam-Prinsensluis-Prinsenstraat-Bridge-South-View-Sunset.jpg",
            "image_alt": "Lovely evening views looking down a Central Amsterdam canal lined with historic row houses and trees, with an oncoming tour boat, seen from the Preisensluis Bridge",
            "cc_image_url": "https://pixabay.com/en/amsterdam-channel-netherlands-1089646/",
            "cc_author_url": "https://pixabay.com/en/users/neshom-447256/",
            "cc_author": "neshom",
            "cc_license": null,
            "cc_license_url": null
        }
        

    },
    {
        "greater_amsterdam": {
            "id": "greater-amsterdam",
            "destination": "Greater Amsterdam",
            "page_url": "/destinations/europe/netherlands/greater-amsterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Greater-Amsterdam-Zaanse-Schans-Windmills.jpg",
            "image_alt": "Lovely colored windmills seen along the water in the Dutch countryside of Zaanse Schans, Netherlands",
            "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history",
            "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachtehttps://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history",
            "cc_author": "cisko66",
            "cc_license": "CC BY 3.0",
            "cc_license_url": "https://creativecommons.org/licenses/by/3.0/legalcode" 
        }

    },
    {
        "rotterdam": {
            "id": "rotterdam",
            "destination": "Rotterdam",
            "page_url": "/destinations/europe/netherlands/rotterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Rotterdam-Markthal-Market-Hall-Exterior-Day.jpg",
            "image_alt": "Markthal marketplace exterior during the day in Rotterdam, Netherlands",
            "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Markthal_-_Rotterdam.jpg&action=history",
            "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachte",
            "cc_author": "Erik Zachte",
            "cc_license": "CC BY-SA 4.0",
            "cc_license_url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode"
        }

    }
],

"france": [
    {
        "paris": {
            "id": "paris",
            "destination": "Paris",
            "page_url": "/destinations/europe/netherlands/amsterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Amsterdam-Prinsensluis-Prinsenstraat-Bridge-South-View-Sunset.jpg",
            "image_alt": "Lovely evening views looking down a Central Amsterdam canal lined with historic row houses and trees, with an oncoming tour boat, seen from the Preisensluis Bridge",
            "cc_image_url": "https://pixabay.com/en/amsterdam-channel-netherlands-1089646/",
            "cc_author_url": "https://pixabay.com/en/users/neshom-447256/",
            "cc_author": "neshom",
            "cc_license": null,
            "cc_license_url": null
        }
    },
    {
        "greater_paris": {
            "id": "greater-paris",
            "destination": "Greater Paris",
            "page_url": "/destinations/europe/netherlands/greater-amsterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Greater-Amsterdam-Zaanse-Schans-Windmills.jpg",
            "image_alt": "Lovely colored windmills seen along the water in the Dutch countryside of Zaanse Schans, Netherlands",
            "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history",
            "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachtehttps://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history",
            "cc_author": "cisko66",
            "cc_license": "CC BY 3.0",
            "cc_license_url": "https://creativecommons.org/licenses/by/3.0/legalcode"
        }
    },
    {
        "lyon": {
            "id": "lyon",
            "destination": "Lyon",
            "page_url": "/destinations/europe/netherlands/rotterdam-attractions-guide",
            "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Rotterdam-Markthal-Market-Hall-Exterior-Day.jpg",
            "image_alt": "Markthal marketplace exterior during the day in Rotterdam, Netherlands",
            "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Markthal_-_Rotterdam.jpg&action=history",
            "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachte",
            "cc_author": "Erik Zachte",
            "cc_license": "CC BY-SA 4.0",
            "cc_license_url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode"
        }
    }
]

}

You can extract those cities and run map on those, like arr["netherlands"].map(e => Object.values(e)).flat().map(place => {......您可以提取这些城市并在这些城市上运行地图,例如arr["netherlands"].map(e => Object.values(e)).flat().map(place => {......

 let arr = { "netherlands": [ { "amsterdam": { "id": "amsterdam", "destination": "Amsterdam", "page_url": "/destinations/europe/netherlands/amsterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Amsterdam-Prinsensluis-Prinsenstraat-Bridge-South-View-Sunset.jpg", "image_alt": "Lovely evening views looking down a Central Amsterdam canal lined with historic row houses and trees, with an oncoming tour boat, seen from the Preisensluis Bridge", "cc_image_url": "https://pixabay.com/en/amsterdam-channel-netherlands-1089646/", "cc_author_url": "https://pixabay.com/en/users/neshom-447256/", "cc_author": "neshom", "cc_license": null, "cc_license_url": null } }, { "greater_amsterdam": { "id": "greater-amsterdam", "destination": "Greater Amsterdam", "page_url": "/destinations/europe/netherlands/greater-amsterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Greater-Amsterdam-Zaanse-Schans-Windmills.jpg", "image_alt": "Lovely colored windmills seen along the water in the Dutch countryside of Zaanse Schans, Netherlands", "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history", "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachtehttps://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history", "cc_author": "cisko66", "cc_license": "CC BY 3.0", "cc_license_url": "https://creativecommons.org/licenses/by/3.0/legalcode" } }, { "rotterdam": { "id": "rotterdam", "destination": "Rotterdam", "page_url": "/destinations/europe/netherlands/rotterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Rotterdam-Markthal-Market-Hall-Exterior-Day.jpg", "image_alt": "Markthal marketplace exterior during the day in Rotterdam, Netherlands", "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Markthal_-_Rotterdam.jpg&action=history", "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachte", "cc_author": "Erik Zachte", "cc_license": "CC BY-SA 4.0", "cc_license_url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode" } } ], "france": [ { "paris": { "id": "paris", "destination": "Paris", "page_url": "/destinations/europe/netherlands/amsterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Amsterdam-Prinsensluis-Prinsenstraat-Bridge-South-View-Sunset.jpg", "image_alt": "Lovely evening views looking down a Central Amsterdam canal lined with historic row houses and trees, with an oncoming tour boat, seen from the Preisensluis Bridge", "cc_image_url": "https://pixabay.com/en/amsterdam-channel-netherlands-1089646/", "cc_author_url": "https://pixabay.com/en/users/neshom-447256/", "cc_author": "neshom", "cc_license": null, "cc_license_url": null } }, { "greater_paris": { "id": "greater-paris", "destination": "Greater Paris", "page_url": "/destinations/europe/netherlands/greater-amsterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Greater-Amsterdam-Zaanse-Schans-Windmills.jpg", "image_alt": "Lovely colored windmills seen along the water in the Dutch countryside of Zaanse Schans, Netherlands", "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history", "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachtehttps://commons.wikimedia.org/w/index.php?title=File:Zaanse_Schans_-_panoramio_-_cisko66.jpg&action=history", "cc_author": "cisko66", "cc_license": "CC BY 3.0", "cc_license_url": "https://creativecommons.org/licenses/by/3.0/legalcode" } }, { "lyon": { "id": "lyon", "destination": "Lyon", "page_url": "/destinations/europe/netherlands/rotterdam-attractions-guide", "image_url": "https://www.travelimager.com/images/netherlands/Netherlands-Rotterdam-Markthal-Market-Hall-Exterior-Day.jpg", "image_alt": "Markthal marketplace exterior during the day in Rotterdam, Netherlands", "cc_image_url": "https://commons.wikimedia.org/w/index.php?title=File:Markthal_-_Rotterdam.jpg&action=history", "cc_author_url": "https://commons.wikimedia.org/wiki/User:Erik_Zachte", "cc_author": "Erik Zachte", "cc_license": "CC BY-SA 4.0", "cc_license_url": "https://creativecommons.org/licenses/by-sa/4.0/legalcode" } } ] } let result = arr["netherlands"].map(e => Object.values(e)).flat(); console.log(result);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM