首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React - map函数?

React - map函数?
EN

Stack Overflow用户
提问于 2021-05-14 08:40:13
回答 2查看 47关注 0票数 1

其思想是获取用户在数据库中使用卡片,并将其与屏幕上正在监听的所有卡片进行比较。基本上用户不应该看到他已经使用过的卡片。

代码语言:javascript
复制
const loadSaveInvestments = async (
    _req: express.Request,
    res: express.Response
  ) => {
    const findSaveInvestments = await prisma.investmentSave.findMany({
      select: {
        investment_id: true,
      },
    });
    if (!findSaveInvestments) throw new HttpException(400, SAVE_INVEST_MISSING);
    res.send(findSaveInvestments);
  };

所以,我把存好的投资卡都寄出去了。现在,在React中-我正在从服务中获取发送的数据(所有卡片和保存的卡片)

代码语言:javascript
复制
const fetchUserSaveInvestments = async () => {
  const res = await axios.get(`${baseURL}/investments-save`);
  return res;
};
代码语言:javascript
复制
const [cards, setCards] = useState([]);
const [saveCards, setSaveCards] = useState([]);

useEffect(() => {
    setLoading(true);

    investService.fetchUserSaveInvestments().then((res) => {
      setSaveCards(res.data);
    });

    investService.fetchCards().then((res) => {
      setCards(res.data.investments);
      setLoading(false);
    });

现在-主要部分。我只想映射卡,如果它的id不是在保存卡状态,所以我尝试了类似的东西..我已经标出了我被卡住的点,我的意思是,我是不是应该创建像双重映射之类的东西呢?如果我走的方向是对的,我就不知道了。

代码语言:javascript
复制
      <div className={classes.CardsContainer}>
        <div className={classes.CardsSelector}>
          {loading && <p> its loading </p>}
          {!loading && (
            <>
              {cards
                .filter(
                  (card) => card.id !== saveCards.?????.investments_id
                )
                .map((card) => (
                  <Card
                    {...card}
                    handleClick={() => handleChooseCard(card)}
                  />
                ))}
            </>
          )}
        </div>

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-05-14 09:08:14

我会尝试使用Set来跟踪保存的卡I,因为它提供了O(1)时间复杂度的查找(速度更快,比为每个过滤器候选者搜索另一个数组更好)。

代码语言:javascript
复制
const [loading, setLoading] = useState(false)
const [cards, setCards] = useState([])
const [saveCards, setSaveCards] = useState(new Set())

useEffect(async () => {
  setLoading(true);

  const { data: savedCards } = await investService.fetchUserSaveInvestments()
  const savedCardIds = savedCards.map(({ investments_id }) => investments_id)
  setSaveCards(new Set(savedCardIds))

  const { data: { investments: cards } } = await investService.fetchCards()
  setCards(cards)
  setLoading(false)
}, [])

然后,您可以使用备忘录进行过滤

代码语言:javascript
复制
const myCards = useMemo(() => cards.filter(({ id }) => !saveCards.has(id)), [cards, saveCards])
代码语言:javascript
复制
{myCards.map(card => (
  <Card
    {...card}
    handleClick={() => handleChooseCard(card)}
  />
))}
票数 0
EN

Stack Overflow用户

发布于 2021-05-14 09:10:18

只需声明以下状态:

代码语言:javascript
复制
const [investmentsIds, setInvestmentIds] = useState([]);

在这里再添加几行代码:

代码语言:javascript
复制
investService.fetchUserSaveInvestments().then((res) => {
   setSaveCards(res.data);
   let savedCardIds = [];
   /* push investment_id in an array */
   res.data.forEach((value)=>{
       savedCardIds.push(value.investments_id);
   })
   setInvestmentIds(savedCardIds);
});

您的JSX:

代码语言:javascript
复制
<div className={classes.CardsContainer}>
   <div className={classes.CardsSelector}>
       {loading && <p> its loading </p>}
       {!loading && (
          {cards.map((card) => (
            {investmentsIds.includes(card.id) && 
              <Card {...card}
              handleClick={() => handleChooseCard(card)}/>
            }
          ))}
       )}
   </div>
</div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67527750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档