4

Searched and tried and no luck so far.

var newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ]

var likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ]

What I want returned is:

var leftUsers = [{name: 'lauren', id: 35}, {name: 'dave', id: 28} ]

basically without the rich object as this is a duplicate. I only care about the id key.

I have tried:

newUsers.forEach((nUser) => {
    likedUsers.forEach((lUser) => {
        if (nUser.id !== lUser.id){
            leftUsers.push(nUser)
        }
    })
})

but obviously this won't work as this will just add them all as soon as they don't match.

if possible would like an es6 solution using forEach/map/filter

thanks

The Walrus
  • 1,148
  • 6
  • 28
  • 46
  • 1
    Possible duplicate of [How to merge two arrays in JavaScript and de-duplicate items](https://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items) – Serge K. Jan 31 '18 at 10:32
  • @SergeK. well no coz this concerns objects, and 2 why are you downvoting me? – The Walrus Jan 31 '18 at 10:33
  • 1
    So, what happened to brian? You want only the items in `new` that __aren't__ in `liked`? – Cerbrus Jan 31 '18 at 10:34
  • 1
    The logic is the same... You just have to change `a[i] === a[j]` to `a[i].myProp === a[j].myProp`. You could also find lot of example all over the internet. – Serge K. Jan 31 '18 at 10:35
  • first merge it into one array, then loop it and save the ids in a new array var. always check the id doesnt exists in this new array and if it exists delete it on the merged one – David Jan 31 '18 at 10:35
  • @David could you make that more convoluted please? – Reinstate Monica Cellio Jan 31 '18 at 10:42
  • You want ES6? Replacing your `var` with `const` would be a start! – SteeveDroz Jan 31 '18 at 10:55
  • @SteeveDroz Maybe those arrays aren't constants ? OP could _need_ to use `var`. Hard to tell without context. – Serge K. Jan 31 '18 at 11:00
  • They use `let`. BTW, they are constant as long as they are not replaced by something else (`newUsers = ...`). If they are edited (things are added, removed or edited from the list), they are still considered "constant" because their *reference* doesn't change. `const` doesn't mean unmodifiable in JS. – SteeveDroz Feb 01 '18 at 08:51

4 Answers4

7

With array.prototype.filter to filter out items that exists in likedUsers and array.prototype.findIndex to check the existence, it should be:

var newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ];
var likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ];

var leftUsers = newUsers.filter(u => likedUsers.findIndex(lu => lu.id === u.id) === -1);

console.log(leftUsers);
Faly
  • 13,291
  • 2
  • 19
  • 37
2

You can do this with filter() and some() methods.

var newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ]
var likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ]

const result = newUsers.filter(e => !likedUsers.some(a => a.id == e.id));
console.log(result)
Nenad Vracar
  • 118,580
  • 15
  • 151
  • 176
0

var newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ];
var likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ];

var leftusers = newUsers.filter( item => !likedUsers.find(item2 => item.id == item2.id));

console.log(leftusers);
Vignesh Raja
  • 7,927
  • 1
  • 33
  • 42
0

You can create a Set of ids that are found in likedUsers, and filter the newUsers by checking if an id is in the Set:

const newUsers = [{name: 'rich', id: 25}, {name: 'lauren', id: 35}, {name: 'dave', id: 28} ]
const likedUsers = [{name: 'derek', id: 39}, {name: 'rich', id: 25}, {name: 'brian', id: 38} ]

const result = newUsers.filter(function({ id }) {
  return !this.has(id) // take all users which ids is not found in the set
}, new Set(likedUsers.map(({ id }) => id))) // create a set of ids in likedUsers and assign to this

console.log(result)
Ori Drori
  • 183,571
  • 29
  • 224
  • 209