1

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);

I have two arrays like that and if needToFilter array's user id exist in likedUsers array it need to be gone.

Filtered array be like :

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

I tried forEach and map but result is the same. I know there is another way but i can't figure out how. Thank you all guys.

Edit : All the answers works great in my case but i used Set approach to fix my problem.

Deniz Firat
  • 159
  • 1
  • 1
  • 10

3 Answers3

1

You need to assign the result of needToFilter.filter() to users.

The filtering function can use some() to test whether there's any match in 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);
Barmar
  • 741,623
  • 53
  • 500
  • 612
1
users = needToFilter.filter(a=> !likedUsers.find(i=> i.id == a.id))

EDIT:

Adding detailed answer so that i can be in same team:

You could use MAP to store liked users then filter if not found in 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)

Tip: Benefit of Map, complexity will be O(n) instead of O(n^2)

wrangler
  • 3,454
  • 1
  • 19
  • 28
1

Maybe you could create a Set of the likedUsersIds before filtering:

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);
Sash Sinha
  • 18,743
  • 3
  • 23
  • 40