【问题标题】:How to map a aliased graphql query in react/js?如何在 react/js 中映射别名 graphql 查询?
【发布时间】:2021-11-12 23:33:46
【问题描述】:

我有这个来自 apollo/GraphQL 的数据/结果对象:

data: {,…}
awarded_casinos: [{Mobile: true, Popular: true, Awarded: true, Live: false, slug: "mr-vegas-casino",…},…]
0: {Mobile: true, Popular: true, Awarded: true, Live: false, slug: "mr-vegas-casino",…}
1: {Mobile: true, Popular: false, Awarded: true, Live: true, slug: "leo-vegas-casino",…}
2: {Mobile: true, Popular: true, Awarded: true, Live: true, slug: "snabbis-casino",…}
3: {Mobile: true, Popular: true, Awarded: true, Live: false, slug: "frank-casino", name: "Frank Casino",…}
live_casinos: [{Mobile: true, Popular: false, Awarded: true, Live: true, slug: "leo-vegas-casino",…},…]
mobile_casinos: [{Mobile: true, Popular: true, Awarded: true, Live: false, slug: "mr-vegas-casino",…},…]
0: {Mobile: true, Popular: true, Awarded: true, Live: false, slug: "mr-vegas-casino",…}
1: {Mobile: true, Popular: false, Awarded: true, Live: true, slug: "leo-vegas-casino",…}
2: {Mobile: true, Popular: true, Awarded: true, Live: true, slug: "snabbis-casino",…}
3: {Mobile: true, Popular: true, Awarded: true, Live: false, slug: "frank-casino", name: "Frank Casino",…}
4: {Mobile: true, Popular: true, Awarded: false, Live: false, slug: "slotv-casino", name: "Slotv Casino",…}
popular_casinos: [{Mobile: true, Popular: true, Awarded: true, Live: false, slug: "mr-vegas-casino",…},…]

我使用了 4 个别名子查询,因此得到了 4 个嵌套对象... 如何一次映射它们?

当我使用没有别名的普通查询时,我只是使用:

              {data.awarded_casinos.map((casino) => (
                <Featured key={casino.id} casino={casino} />
              ))}

我认为为每个对象做一个 .map 并不理想.....

这是我的查询(可能不相关):

const CASINO_QUERY = gql`
query casinos($popular: Boolean, $awarded: Boolean, $mobile: Boolean, $live: Boolean ) {
    
    popular_casinos: casinos(where: { Popular: $popular })
    {
    Mobile
    Popular
    Awarded
    Live
    slug
    name
    logo {
      url
    }
    rating
    owner
    founded
    payout_percentage
    expert_consensus
    min_deposit
    max_deposit
    payouts
    total_rating
    games
    withdrawals
    website_experience
    url
    aff_link
    theme_color
    bonuses_info
    featured_bonus_1
    featured_bonus_type
    bonuses {
      name
      slug
      title
      amount
      code
      min_deposit
      value
      wager
      cashable
      bonus_type {
        name
      }
    }
    deposit_methods {
      name
      logo {
        url
      }
    }
    securities {
      name
      logo {
        url
      }
    }
    supported_devices {
      name
      logo {
        url
      }
    }
  }

  awarded_casinos: casinos(where: { Awarded: $awarded })
    {
    Mobile
    Popular
    Awarded
    Live
    slug
    name
    logo {
      url
    }
    rating
    owner
    founded
    payout_percentage
    expert_consensus
    min_deposit
    max_deposit
    payouts
    total_rating
    games
    withdrawals
    website_experience
    url
    aff_link
    theme_color
    bonuses_info
    featured_bonus_1
    featured_bonus_type
    bonuses {
      name
      slug
      title
      amount
      code
      min_deposit
      value
      wager
      cashable
      bonus_type {
        name
      }
    }
    deposit_methods {
      name
      logo {
        url
      }
    }
    securities {
      name
      logo {
        url
      }
    }
    supported_devices {
      name
      logo {
        url
      }
    }
  }


  mobile_casinos: casinos(where: { Mobile: $mobile })
    {
    Mobile
    Popular
    Awarded
    Live
    slug
    name
    logo {
      url
    }
    rating
    owner
    founded
    payout_percentage
    expert_consensus
    min_deposit
    max_deposit
    payouts
    total_rating
    games
    withdrawals
    website_experience
    url
    aff_link
    theme_color
    bonuses_info
    featured_bonus_1
    featured_bonus_type
    bonuses {
      name
      slug
      title
      amount
      code
      min_deposit
      value
      wager
      cashable
      bonus_type {
        name
      }
    }
    deposit_methods {
      name
      logo {
        url
      }
    }
    securities {
      name
      logo {
        url
      }
    }
    supported_devices {
      name
      logo {
        url
      }
    }
  }  


live_casinos: casinos(where: { Live: $live })
{
Mobile
Popular
Awarded
Live
slug
name
logo {
  url
}
rating
owner
founded
payout_percentage
expert_consensus
min_deposit
max_deposit
payouts
total_rating
games
withdrawals
website_experience
url
aff_link
theme_color
bonuses_info
featured_bonus_1
featured_bonus_type
bonuses {
  name
  slug
  title
  amount
  code
  min_deposit
  value
  wager
  cashable
  bonus_type {
    name
  }
}
deposit_methods {
  name
  logo {
    url
  }
}
securities {
  name
  logo {
    url
  }
}
supported_devices {
  name
  logo {
    url
  }
}
}

}
`;

export default CASINO_QUERY;

【问题讨论】:

    标签: javascript reactjs graphql apollo


    【解决方案1】:

    您可以将它们连接到一个数组中并映射到该新数组

      const { popular_casinos, awarded_casinos, mobile_casinos, live_casinos } =
        data;
      const allCasinos = [
        ...popular_casinos,
        ...awarded_casinos,
        ...mobile_casinos,
        ...live_casinos,
      ];
    ...
        {allCasinos.map((casino) => (
          <Featured key={casino.id} casino={casino} />
        ))}
    
    

    顺便说一句,您可以使用GraphQL fragments 进行不那么冗长的查询。假设赌场类型称为Casino,查询将如下所示:

    const CASINO_QUERY = gql`
      query casinos(
        $popular: Boolean
        $awarded: Boolean
        $mobile: Boolean
        $live: Boolean
      ) {
        popular_casinos: casinos(where: { Popular: $popular }) {
          ...CasinoParts
        }
    
        awarded_casinos: casinos(where: { Awarded: $awarded }) {
          ...CasinoParts
        }
    
        mobile_casinos: casinos(where: { Mobile: $mobile }) {
          ...CasinoParts
        }
    
        live_casinos: casinos(where: { Live: $live }) {
          ...CasinoParts
        }
      }
    
      fragment CasinoParts on Casino {
        Mobile
        Popular
        Awarded
        Live
        slug
        name
        logo {
          url
        }
        rating
        owner
        founded
        payout_percentage
        expert_consensus
        min_deposit
        max_deposit
        payouts
        total_rating
        games
        withdrawals
        website_experience
        url
        aff_link
        theme_color
        bonuses_info
        featured_bonus_1
        featured_bonus_type
        bonuses {
          name
          slug
          title
          amount
          code
          min_deposit
          value
          wager
          cashable
          bonus_type {
            name
          }
        }
        deposit_methods {
          name
          logo {
            url
          }
        }
        securities {
          name
          logo {
            url
          }
        }
        supported_devices {
          name
          logo {
            url
          }
        }
      }
    `;
    
    export default CASINO_QUERY;
    

    【讨论】:

    • 非常感谢,效果很好...顺便发现了一些东西,我在我的对象中收到了很多重复的赌场,有没有简单的方法来过滤 slug 并且只获得唯一的?
    • 谢谢,你为我节省了很多时间......这解决了它: const ids = allCasinos.map(o => o.slug) const filters = allCasinos.filter(({slug}, index) => !ids.includes(slug, index + 1))
    猜你喜欢
    • 2021-02-14
    • 2022-06-23
    • 2022-08-04
    • 1970-01-01
    • 2023-01-07
    • 2022-12-29
    • 2023-01-15
    • 2021-08-11
    • 2021-08-08
    相关资源
    最近更新 更多