如何从数组内的嵌套对象中获取一个对象

问题描述 投票:0回答:1

我从一个开放的API中获取数据。从那个API,我想在浏览器上显示图像。但是问题是图像数组里面有3个图像URL。在使用数组的映射方法后,我调用了第一个对象[0],但它不起作用。我正在使用React js是我的前端应用程序。

这是我的React js组件。

import React, { useEffect, useState } from "react";
import "./ActivitiesList.css";
import axios from "axios";

import "./ActivitiesList.css";

function ActivitiesList() {
  const [activities, setactivities] = useState({ data: [] });
  const [show, setshow] = useState(10);

  useEffect(() => {
    fetchingData();
  }, []);

  const fetchingData = () => {
    axios
      .get("/activities")
      .then(response => {
        //console.log("response", response);
        setactivities({ data: response.data.data }); 
      })
      .catch(err => console.log(err));
  };

  return (
    <div className="EventList">
      <section className="our-event">
        <div className="grid-container">
          {activities.data.slice(0, show).map((list, index) => {
            return (
              <div key={index}>
                <a
                  href={list.info_url} /
                  style={{
                    cursor: "pointer",
                    textDecoration: "none",
                    color: "black"
                  }}
                  target="a_blank"
                >
                  <div className="whole">
                    <div className="Personcontainer">
                      <div className="Box">
                        {list.description.images.map((img, index) => {
                          return (
                            <img
                              src={img.url[0]} //IN HERE I TRY TO SHOW FIRST OBJECT
                              alt="pics"
                              style={{ width: "270px", height: "270px" }}
                            />
                          );
                        })}
                      </div>
                    </div>
                  </div>

                </a>
              </div>
            );
          })}
        </div>
        {show < activities.data.length && (
          <button onClick={() => setshow(show + 10)} className="Button">
            loadmore
          </button>
        )}
      </section>
    </div>
  );
}

export default ActivitiesList;

这里是开放API的JSON文件。

{
  "meta": {
    "count": "96",
    "next": "http://open-api.myhelsinki.fi/v1/activities/?limit=1&start=1"
  },
  "data": [
    {
      "id": "f67de4f6-d23e-49a7-b9dd-63d68df533a3",
      "name": {
        "fi": "Purjehdus 1700-luvun tyyliin tykkisluuppi Dianalla",
        "en": "Cannon sloop Diana´s sailings",
        "sv": "Seglingar med kanonslupen Diana",
        "zh": null
      },
      "source_type": {
        "id": 3,
        "name": "MyHelsinki"
      },
      "info_url": "https://www.suomenlinnatours.com/en/cannon-sloop-diana?johku_product=7",
      "modified_at": "2020-01-27T09:37:27.221Z",
      "location": {
        "lat": 60.145111083984375,
        "lon": 24.987560272216797,
        "address": {
          "street_address": "Suomenlinna Tykistölahti Pier",
          "postal_code": null,
          "locality": "Helsinki"
        }
      },
      "description": {
        "intro": null,
        "body": "<p>Luvassa on amiraali Chapamin tahdittama mielenkiintoinen laivamatka valistusajan Viaporiin. Dianan purjehduksien aikana nähdään Suomenlinnaa mereltä käsin ja kuullaan saaristolaivaston kiehtovasta historiasta. Osallistujat pääsevät halutessaan avustamaan 1700-luvun univormuihin sonnustautunutta miehistöä purjeiden nostossa ja laskussa, lisäksi muutama reipas pääsee mukaan soutuharjoitukseen.</p>\r\n\r\n<p>Purjehdukset lähtevät Suomenlinnan Tykistölahden laiturista. Suomenlinnaan pääsee JT-Linen vesibussilla tai HSL:n lautalla Kauppatorilta (venematka ei kuulu lipun hintaan). Diana on avovene, joten säänmukainen varustus on tärkeä.&nbsp;<br />\r\n<br />\r\n<span><span>Lasten meriseikkailu – perhepurjehdus ajalla 26.6.- 3.8.2019<br />\r\nkeskiviikkoisin, torstaisin ja lauantaisin kello 12.30<br />\r\nElokuun lauantaisin 10.8., 17.8., 24.8. ja 31.8.2019 kello 12.30.<br />\r\n<br />\r\nPurjehdus 1700-luvun tyyliin – yleisöpurjehdus ajalla 26.6.- 3.8.2019:<br />\r\nKeskiviikkoisin, torstaisin ja lauantaisin kello 15.30<br />\r\nElokuun lauantaisin 10.8., 17.8., 24.8. ja 31.8.2019 kello 15.30</span></span><br />\r\n&nbsp;</p>\r\n",
        "images": [ // FROM HERE I WANT TO SHOW FIRST OBJECT URL.
          {
            "url": "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana.jpg",
            "copyright_holder": "",
            "license_type": {
              "id": 1,
              "name": "All rights reserved."
            }
          },
          {
            "url": "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana_2.jpg",
            "copyright_holder": "",
            "license_type": {
              "id": 1,
              "name": "All rights reserved."
            }
          },
          {
            "url": "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana_3.jpg",
            "copyright_holder": "",
            "license_type": {
              "id": 1,
              "name": "All rights reserved."
            }
          }
        ]
      },
      "tags": [
        {
          "id": "myhelsinki:45",
          "name": "sea"
        },
        {
          "id": "myhelsinki:836",
          "name": "suomenlinna"
        },
        {
          "id": "myhelsinki:793",
          "name": "history"
        }
      ],
      "where_when_duration": {
        "where_and_when": "Suomenlinna, kesäkuusta elokuuhun",
        "duration": "N. 1h 45min"
      }
    }
  ],
  "tags": {
    "myhelsinki:45": "sea",
    "myhelsinki:793": "history",
    "myhelsinki:836": "suomenlinna"
  }
}
arrays reactjs object
1个回答
0
投票

Probelm您是否正在尝试访问URL

  src={img.url[0]} //IN HERE I TRY TO SHOW FIRST OBJECT

而不是

 src={img[0].url} 

因为您在这里将图像对象作为img获得


0
投票

您看起来像这样-演示https://codesandbox.io/s/competent-zhukovsky-icl60

export default class App extends React.Component {
  state = {
    items: {
      meta: {
        count: "96",
        next: "http://open-api.myhelsinki.fi/v1/activities/?limit=1&start=1"
      },
      data: [
        {
          id: "f67de4f6-d23e-49a7-b9dd-63d68df533a3",
          name: {
            fi: "Purjehdus 1700-luvun tyyliin tykkisluuppi Dianalla",
            en: "Cannon sloop Diana´s sailings",
            sv: "Seglingar med kanonslupen Diana",
            zh: null
          },
          source_type: {
            id: 3,
            name: "MyHelsinki"
          },
          info_url:
            "https://www.suomenlinnatours.com/en/cannon-sloop-diana?johku_product=7",
          modified_at: "2020-01-27T09:37:27.221Z",
          location: {
            lat: 60.145111083984375,
            lon: 24.987560272216797,
            address: {
              street_address: "Suomenlinna Tykistölahti Pier",
              postal_code: null,
              locality: "Helsinki"
            }
          },
          description: {
            intro: null,
            body:
              "<p>Luvassa on amiraali Chapamin tahdittama mielenkiintoinen laivamatka valistusajan Viaporiin. Dianan purjehduksien aikana nähdään Suomenlinnaa mereltä käsin ja kuullaan saaristolaivaston kiehtovasta historiasta. Osallistujat pääsevät halutessaan avustamaan 1700-luvun univormuihin sonnustautunutta miehistöä purjeiden nostossa ja laskussa, lisäksi muutama reipas pääsee mukaan soutuharjoitukseen.</p>\r\n\r\n<p>Purjehdukset lähtevät Suomenlinnan Tykistölahden laiturista. Suomenlinnaan pääsee JT-Linen vesibussilla tai HSL:n lautalla Kauppatorilta (venematka ei kuulu lipun hintaan). Diana on avovene, joten säänmukainen varustus on tärkeä.&nbsp;<br />\r\n<br />\r\n<span><span>Lasten meriseikkailu – perhepurjehdus ajalla 26.6.- 3.8.2019<br />\r\nkeskiviikkoisin, torstaisin ja lauantaisin kello 12.30<br />\r\nElokuun lauantaisin 10.8., 17.8., 24.8. ja 31.8.2019 kello 12.30.<br />\r\n<br />\r\nPurjehdus 1700-luvun tyyliin – yleisöpurjehdus ajalla 26.6.- 3.8.2019:<br />\r\nKeskiviikkoisin, torstaisin ja lauantaisin kello 15.30<br />\r\nElokuun lauantaisin 10.8., 17.8., 24.8. ja 31.8.2019 kello 15.30</span></span><br />\r\n&nbsp;</p>\r\n",
            images: [
              // FROM HERE I WANT TO SHOW FIRST OBJECT URL.
              {
                url:
                  "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana.jpg",
                copyright_holder: "",
                license_type: {
                  id: 1,
                  name: "All rights reserved."
                }
              },
              {
                url:
                  "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana_2.jpg",
                copyright_holder: "",
                license_type: {
                  id: 1,
                  name: "All rights reserved."
                }
              },
              {
                url:
                  "https://edit.myhelsinki.fi/sites/default/files/2017-06/Tykkisluuppi_Diana_3.jpg",
                copyright_holder: "",
                license_type: {
                  id: 1,
                  name: "All rights reserved."
                }
              }
            ]
          },
          tags: [
            {
              id: "myhelsinki:45",
              name: "sea"
            },
            {
              id: "myhelsinki:836",
              name: "suomenlinna"
            },
            {
              id: "myhelsinki:793",
              name: "history"
            }
          ],
          where_when_duration: {
            where_and_when: "Suomenlinna, kesäkuusta elokuuhun",
            duration: "N. 1h 45min"
          }
        }
      ],
      tags: {
        "myhelsinki:45": "sea",
        "myhelsinki:793": "history",
        "myhelsinki:836": "suomenlinna"
      }
    }
  };
  render() {
    const { items } = this.state;
    let images = items ? items.data[0].description.images : [];
    console.log(items.data[0]);
    return (
      <div>
        <h2>List of items</h2>
        {images.map((image, index) => (
          <div key={index}>
            <img src={image.url} alt="imageicon" />
          </div>
        ))}
      </div>
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.