删除重复的 JSX 元素 |反应 Strapi graphql

Posted

技术标签:

【中文标题】删除重复的 JSX 元素 |反应 Strapi graphql【英文标题】:Remove duplicate JSX elements | React Strapi graphql 【发布时间】:2021-09-29 17:13:58 【问题描述】:

长话短说,我有一个 JSX 元素数组,看起来像这样:

              <ChatListCard
                key=index
                prop1=prop1
                prop2=prop2
                prop3=prop3
              />

我从 Strapi/Graphql API 中的两个不同表中获取这些“卡片”的道具,所以我做了这样的事情:

[].concat(
  array1.map((item,index)=> <Card key=index prop1=item.prop1 ... />),
  array2.map((item,index)=> <Card key=index prop1=item.prop1 ... />)
)

问题是 array1 和 array2 包含一些相同的“项目”,需要过滤掉。有没有办法做到这一点,使用JS:

[].concat(...).filter((magic)=> magic but filtered) //use the filter here

,或者我应该在 GraphQL 中进行。 (我已经在其中使用了 where 子句来过滤掉我不需要的项目)

query ProposalsAndRequests($input:String!)
  proposals(where: _or:[
    owner:email:$input
    task:owner:email:$input
  ],sort:"created_at:desc")
    id
    ...
    
  
  chatRequests(where:_or:[
    users_permissions_user:email:$input
    task:owner:email:$input
  ],sort:"created_at:desc")
    id
    ...
  

注意:chatRequests 和 Proposals 包含相同的字段,它们只是在站点的其他地方用于不同的目的 users_permissions_user 和 owner 也是同一个关系

【问题讨论】:

您的问题解决了吗? :-) 嘿!仍在尝试这样做.. set 方法似乎在某种程度上有效,但没有完成这项工作,但我想如果我弄清楚我是如何工作的,我会尝试使用 reduce 的复杂过滤器:D 查看我更新后的答案,以获得可能更简单易懂且不需要减速器的解决方案。 【参考方案1】:

您可以使用 js 中的“Set”数据结构来完成。 const set = new Set(arr);。套装不能有重复! :-) 但如果引用不同,它们可以具有相同的对象。

对于更复杂的过滤器,使用 .reduce 函数仅累积唯一值。

或者,您可以通过以下方式强制删除重复项:

const noDubs = [];

myArr.foreach(item => 
  if(!noDubs.some(entry = entry.special.property === item.special.property) noDubs.push(item);
);

【讨论】:

以上是关于删除重复的 JSX 元素 |反应 Strapi graphql的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚反应应用程序中js和jsx之间的区别[重复]

无法在反应 jsx 值道具中重复十六进制 html 实体

在 className if-else 语法中反应 JSX [重复]

如何在反应中从渲染函数返回一个空的jsx元素?

如何使整个应用程序上的反应可用,而无需在每个 jsx 文件中一次又一次地导入它[重复]

如何在 JSX 中重复一个元素?