【问题标题】:How can I get the 1st image from each album with an even ID in React using Fetch?如何使用 Fetch 在 React 中从每个专辑中获取具有偶数 ID 的第一张图片?
【发布时间】:2020-12-14 23:39:53
【问题描述】:

我有一个返回 5000 张图像的 API。我想在 React 中使用 Fetch 从每个相册中获取第一张带有偶数 ID 的图片。

问题是无法弄清楚如何过滤数据以获取具有偶数 ID 和偶数 ID 专辑的第一张图片的数据。

import React, {useState, useEffect} from 'react';

// Import Materials from Material-ui
import {Grid} from '@material-ui/core';


const Album = () => {
    const [images, setImages] = useState([]);
    const [imagesCount, setImagesCount] = useState(10);
    const api = 'https://jsonplaceholder.typicode.com/photos';

    useEffect(() => {
        fetch(api)
        .then(res => res.json())
        .then(data => {
          const filterData = data.filter(x => x.albumId % 2 === 0);
          for(const url of filterData) {
            if(url.albumId % 2 === 0) {
              // How to get only the first even ablumID url of each even albumID?
            }
          }
          setImages(filterData);
          console.log(filterData);
        })
        .catch(err => console.log(err))

      }, []);

    return (
        <div>
        <Grid container spacing={3} alignItems="center">
          {images.map((album) => (
            <Grid item key={album.id} xs={12} sm={6} md={4}>
              <img className="albumImg" src={album.url} alt={album.title} />
            </Grid>
          ))}
        </Grid>
        </div>
    )
}

export default Album;

【问题讨论】:

  • 那么您遇到的问题是什么?顺便说一句,Array.prototype.filter 返回一个新数组并且不会改变旧数组,因此如果您想在过滤后的数组上调用 setImages,那么您应该将该新数组存储在一个变量中并使用它来设置您的state.
  • data.filter(x => x.albumId % 2 === 0) 并没有真正过滤任何东西。
  • 查看我更新的评论。
  • data.filter(x => x.albumId % 2 === 0);您是在尝试过滤偶数的 id,还是在尝试获取 id===0?
  • 我正在尝试过滤具有偶数的 ID。

标签: javascript reactjs api fetch react-functional-component


【解决方案1】:

至于第一个问题,Array.prototype.filter 不会改变现有数组,而是返回一个包含通过测试的元素的新数组,因此您需要将该新数组存储在一个变量中并使用它来更新您的状态,

const api = "https://jsonplaceholder.typicode.com/photos";

fetch(api)
  .then((res) => res.json())
  .then((data) => {
    const filterData = data.filter((x) => x.albumId % 2 === 0);

    console.log("original", data.length);
    console.log("filtered", filterData.length);
  })
  .catch((err) => console.log(err));

至于您的第二个问题,如果您想创建一个包含唯一 albumIds 的项目的新数组,您可以使用 Array.prototype.reduce 循环所有项目并仅添加那些尚未在 @987654326 中的项目@,

const api = "https://jsonplaceholder.typicode.com/photos";

fetch(api)
  .then((res) => res.json())
  .then((data) => {
    const filterData = data.filter((x) => x.albumId % 2 === 0);
    const uniqueItems = filterData.reduce((accumulator, item) => {
      const isDuplicateItem = accumulator.find(
        (i) => i.albumId === item.albumId
      );
      // append the item if there's no existing
      // item in the array with the same `albumId`
      if (!isDuplicateItem) {
        return [...accumulator, item];
      }

      return accumulator;
    }, []);

    console.log("uniqueItems", uniqueItems.length);
    console.log(uniqueItems[0]);
    console.log(uniqueItems[1]);
  })
  .catch((err) => console.log(err));

如果需要查看更多:

【讨论】:

  • 但是我怎样才能只得到每个偶数数组的第一个数组呢?
  • @Rastezzy 你能解释一下“每个偶数数组的第一个数组”是什么意思吗?您正在迭代具有以下属性的对象数组:{albumId: number, id: number, title: string, url: string, thumbnailUrl: string}。你说的array是什么?
  • 抱歉,术语使用不当,我指的是对象。现在,由于我们有多个具有相似专辑 ID 的对象,我只需要第一个偶数的第一个专辑 ID 的 URL。因此,来自第一个对象的第一个 url 仅具有专辑 ID 2,而不是其余的具有专辑 ID 2 的 URL,依此类推.. 这有意义吗?
  • 我已经更新了我的代码,这是我能得到的最接近答案的。
  • @Rastezzy 看到我的编辑 - 我想这就是你要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多