Angular 2+ compare differences between 2 arrays

Viewed 71

The arrays I have

const users = [
      { id: 1, name: "field 1" },
      { id: 2, name: "field 2" },
      { id: 3, name: "field 3" },
      { id: 4, name: "field 4" },
    ];
    const onlineUsers = [
      { id: 1, name: "field 1" },
      { id: 3, name: "field 3" }
    ];

I would like to find the online and offline ones by comparing the two series

I want to do:

const userLists = [
      { id: 1, name: "field 1", online: true },
      { id: 2, name: "field 2", online: false },
      { id: 3, name: "field 3", online: true },
      { id: 4, name: "field 4", online: false },
    ];
3 Answers

Using Array.map and Array.some

const users = [
      { id: 1, name: "field 1" },
      { id: 2, name: "field 2" },
      { id: 3, name: "field 3" },
      { id: 4, name: "field 4" },
    ];
    const onlineUsers = [
      { id: 1, name: "field 1" },
      { id: 3, name: "field 3" }
    ];
    
    var retVal=users.map(u=>{
    var isOnline=onlineUsers.some(ou=> ou.id==u.id);//this will check if onlineUsers have some record with given userid
    return {...u,online:isOnline}
    })
    
    console.log(retVal)

You can just traverse through the user list and you can find out the onlineuser using find and just push it in the onlineuserList.

const users = [
      { id: 1, name: "field 1" },
      { id: 2, name: "field 2" },
      { id: 3, name: "field 3" },
      { id: 4, name: "field 4" },
    ];
    const onlineUsers = [
      { id: 1, name: "field 1" },
      { id: 3, name: "field 3" }
    ];

const userLists  = [];

users.forEach(user => {
  if(onlineUsers.find(q => q.id == user.id)){
    userLists.push({
      id: user.id,
      name: user.name,
      online: "true"
    })
  }
  else{
    userLists.push({
      id: user.id,
      name: user.name,
      online: "false"
    })
  }
})

console.log(userLists);

a bit faster approach using Array.indexOf() and JSON.strigify()

const onlineUsers = JSON.stringify([
  { id: 1, name: "field 1" },
  { id: 3, name: "field 3" }
]);  

const userList = users.map(user => 
  ({ 
     ...user,
     online: onlineUsers.indexOf(JSON.stringify(user)) > -1
   })
);

OR if you neither want to change original onlineUsers array nor declare another variable:

const userList = users.map(user => 
  ({ ...user, online: JSON.stringify(onlineUsers).indexOf(JSON.stringify(user)) > -1 })
);
Related