【问题标题】:Filtering an array under the forEach loop [duplicate]在forEach循环下过滤数组[重复]
【发布时间】:2021-07-15 00:50:59
【问题描述】:

const likedUsers = [{
    id: "1"
  },
  {
    id: "2"
  }
]
const needToFilter = [{
    id: "1",
    userInfo: "info"
  }, {
    id: "2",
    userInfo: "info"
  },
  {
    id: "3",
    userInfo: "info"
  }
]
likedUsers.forEach(item => needToFilter.filter(needToFilter => {
  return needToFilter.id !== item.id
}));
console.log(users);

我有两个这样的数组,如果需要过滤数组的用户 id 存在于 likeUsers 数组中,它需要消失。

过滤后的数组如下:

needToFilter => [{id:"3",userInfo:"info"}]

我试过forEachmap 但结果是一样的。我知道还有另一种方法,但我不知道如何。 谢谢大家。

编辑: 在我的情况下,所有答案都很好,但我使用 Set 方法来解决我的问题。

【问题讨论】:

  • 因此,如果我理解正确,您有一个名为 like 的数组和一个名为 needToFilter 的数组。您想从数组中删除所有不在 likeUsers 中的条目...对吗?
  • 你在哪里分配users
  • 而不是过滤器使用some并在找到匹配值时返回true退出它
  • 或者您需要 needToFilter 数组中只有唯一元素。

标签: javascript arrays filter


【解决方案1】:

你需要将needToFilter.filter()的结果赋值给users

过滤功能可以使用some()来检测likedUsers中是否有匹配项。

const likedUsers = [{
    id: "1"
  },
  {
    id: "2"
  }
]
const needToFilter = [{
    id: "1",
    userInfo: "info"
  }, {
    id: "2",
    userInfo: "info"
  },
  {
    id: "3",
    userInfo: "info"
  }
]

const users = needToFilter.filter(n => !likedUsers.some(l => l.id == n.id));
console.log(users);

【讨论】:

  • 非常感谢!
【解决方案2】:
users = needToFilter.filter(a=> !likedUsers.find(i=> i.id == a.id))

编辑:

添加详细答案,以便我可以在同一个团队中:

您可以使用MAP 存储喜欢的用户,如果在地图中找不到,则过滤:

const likedUsers = [
    {
        "id":"1"
    },
    {
        "id":"2"
    }
];

const needToFilter = [
    {
        "id":"1",
        "userInfo":"info"
    },
    {
        "id":"2",
        "userInfo":"info"
    },
    {
        "id":"3",
        "userInfo":"info"
    }
];

const mp = new Map();
    
likedUsers.forEach(i=>mp.set(i.id,true));

const users = needToFilter.filter(i => !mp.has(i.id));
console.log(users)

提示:Map的好处,复杂度将是O(n)而不是O(n^2)

【讨论】:

    【解决方案3】:

    也许您可以在过滤之前创建likedUsersIdsSet

    const likedUsers = [
      {
        id: "1"
      },
      {
        id: "2"
      }
    ];
    
    const needToFilter = [
      {
        id: "1",
        userInfo: "info"
      }, 
      {
        id: "2",
        userInfo: "info"
      },
      {
        id: "3",
        userInfo: "info"
      }
    ];
    
    const likedUsersIds = new Set(likedUsers.map(o => o.id));
    const filtered = needToFilter.filter(o => !likedUsersIds.has(o.id));
    console.log(filtered);

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2021-12-20
      • 1970-01-01
      • 2016-12-23
      • 2021-05-30
      • 2020-10-31
      • 2013-07-18
      • 2023-03-06
      • 2013-07-10
      相关资源
      最近更新 更多