【问题标题】:Using indexOf in order to filt an array - ( Next.js app with typescript )使用 indexOf 过滤数组 - (带有 typescript 的 Nextjs 应用程序)
【发布时间】:2021-06-18 23:07:35
【问题描述】:

我的 next.js 应用中有这个数组

arr1

[

  { 
    identifier: "60a17722225f2918c445fd19",
    name: "Ben Awad",
    _id: "60c94480b8d43c28d0a6eb73
  },
  
  {
    identifier: "60a455d11fa62a1510b408f8",
    name: "dev ed"
    _id: "60bf62cede309f1a30fe88ab"
  }

]

我还有另一个大数组

arr2

[

  {
    name: "Ben Awad",
    _id: "60a17722225f2918c445fd19
  },

  {
    name: "dev ed",
    _id: "60a455d11fa62a1510b408f8"
  },

  {
    name: "Katlyn",
    _id: "60a52500ce96f30c14fdaff9"
  },

  {
    name: "Mike",
    _id: "60c95deeb8d43c28d0a6eb74"
  },

  {
    name: "Kassandra",
    _id: "60c960ddb8d43c28d0a6eb7a"
  }

]

我想要一个新数组,它应该包含所有用户,除了那些与 arr1 具有相似 ID 的用户

这就是我所做的逻辑(注意 arr1 和 arr2 会不断变化

我 = arr1 AllUsers = arr2

const LookFriends =
    Me &&
    AllUsers.filter(({ _id }) => {
      return Me.friends.indexOf(_id) === -1;
});

console.log(LookFriends);

输出应该是 Katlyn、Mike 和 Kassandra,但 console.log 显示...

[

  {
    name: "Ben Awad",
    _id: "60a17722225f2918c445fd19
  },

  {
    name: "dev ed",
    _id: "60a455d11fa62a1510b408f8"
  },

  {
    name: "Katlyn",
    _id: "60a52500ce96f30c14fdaff9"
  },

  {
    name: "Mike",
    _id: "60c95deeb8d43c28d0a6eb74"
  },

  {
    name: "Kassandra",
    _id: "60c960ddb8d43c28d0a6eb7a"
  }

]

我真的很难根据另一个数组过滤一个数组,我该怎么办?

【问题讨论】:

    标签: javascript typescript next.js


    【解决方案1】:

    在这种情况下你需要使用'findIndex',然后比较_id字段本身:

    const LookFriends =
        Me &&
        AllUsers.filter(({ _id }) => {
          return Me.friends.findIndex(friend => friend._id === _id) === -1;
    });
    

    如果您使用“indexOf”,它会将整个对象与那个 _id 值进行比较。

    【讨论】:

    • 它工作得很好,我很生气,厌倦了试图找到出路,所以我没有尝试这个 lmao !
    【解决方案2】:

    如果元素与我们的对象或 Set 中的任何 id 都不匹配,您可以从第一个数组中提取标识符并过滤第二个数组

    // with an object
    const ids = {}
    
    arr1.forEach(user => {
      ids[user.identifier] = true
    })
    
    const filtered = arr2.filter(user => !ids[user._id])
    
    // or with a Set
    const ids = new Set(arr1.map(user => user.identifier))
    
    const filtered = arr2.filter(user => !ids.has(user._id))
    

    【讨论】:

    • 我已经找到了解决方案,但感谢您的回答!
    【解决方案3】:

    请尝试使用此代码。

        Me &&
        AllUsers.filter(({ _id }) => {
          let bExist = false
          Me.friends.map( (friend) => {
            if ( friend._id === _id )
              bExist = true
          })
          return bExist
        });
    

    让我知道它是否有效。

    【讨论】:

    • 我建议使用“reduce”而不是 map。你可以声明“bExist = friends.reduce”,然后这样传递,这样更具声明性。
    • 有人已经给了我解决方案,但是,我试过了,它成功了,谢谢!
    猜你喜欢
    • 2022-10-02
    • 2020-05-28
    • 2019-07-16
    • 2020-04-04
    • 2015-04-10
    • 2021-12-06
    • 2018-02-07
    • 2012-08-18
    • 2019-10-28
    相关资源
    最近更新 更多