Попытка отобразить данные без дубликатов

#javascript #reactjs

#javascript #reactjs

Вопрос:

я здесь новичок! Я пытаюсь создать раздел фильтрации по жанру с этими данными.JSON следующим образом:

   "movies": [
    {
      "title": "The Shawshank Redemption",
      "release": "1994",
      "rating": "9.2",
      "genre": "Drama",
      "id": 1
    },
    {
      "title": "The Godfather",
      "release": "1972",
      "rating": "9.1",
      "genre": "Crime Drama",
      "id": 2
    },
    {
      "title": "The Godfather Part II",
      "release": "1974",
      "rating": "9",
      "genre": "Crime Drama",
      "id": 3
    },
    {
      "title": "The Dark Knight",
      "release": "2008",
      "rating": "9",
      "genre": "Action",
      "id": 4
    },
    {
      "title": "Howl's Moving Castle ",
      "release": "2001",
      "rating": "9.5",
      "genre": "Animation",
      "id": 5
    }]
 

Ниже приведена моя текущая реализация метода map, но в результате есть дубликаты по жанру (две криминальные драмы)

Я пытаюсь отфильтровать дубликаты. Как мне это сделать?

 import useFetch from "./useFetch";

const MovieList = () => {
  const { data, isPending, error, setData } = useFetch(
    "http://localhost:8002/movies"
  );

return (
    <div className="movie-list">
      
      <div className="row">
        <div className="col-2">
          <ul className="list-group">
            <li className="list-group-item">All Genre</li>
            {data.map((item) => {
                return (
                  <li
                    key={item.id}
                    onClick={handleFilterGenre}
                    className="list-group-item"
                  >
                    {item.genre}
                  </li>
                );
              })}
          </ul>
        </div>

 

Любая помощь очень ценится! Спасибо

Ответ №1:

Попробуйте этот подход: (внешний массив, содержащий уже написанные жанры — для фильтрации)

 import useFetch from "./useFetch";

const MovieList = () => {
  const { data, isPending, error, setData } = useFetch(
    "http://localhost:8002/movies"
  );

const displayedGenres = [];

return (
    <div className="movie-list">
      
      <div className="row">
        <div className="col-2">
          <ul className="list-group">
            <li className="list-group-item">All Genre</li>
            {data.map((item) => {
                if (displayedGenres.includes(item.genre))
                   return;
                else {
                displayedGenres.push(item.genre);
                return (
                  <li
                    key={item.id}
                    onClick={handleFilterGenre}
                    className="list-group-item"
                  >
                    {item.genre}
                  </li>
                );
               }
              })}
          </ul>
        </div>
 

Ответ №2:

Извлеките то, что вам нужно, из ваших загруженных данных.

 const { data, isPending, error, setData } = useFetch('http://.../movies');
const genres = useMemo(() => data ? [...new Set(data.map(_ => _.genre))] : [] , [data]);


{genres.map(genre => (
  <li
    key={genre}
    onClick={() => filterGenre(genre)}
    className="list-group-item"
  >
    {genre}
  </li>
)}