Reputation:
I have arr = [1,2,3]
and ids = [1,2,3,4,5,6]
. I want to find if any of the arr item
exist in the ids
. If yes the invalid
is true.
Which of the below code is better? or they are the same thing?
const invalid = !arr.every((id) => ~ids.indexOf(id));
const invalid = arr.some((id) => ids.includes(id));
Upvotes: 0
Views: 59
Reputation: 17397
The two statements have a very different semantics.
The callbacks are the same, ie ids.includes(id) === true
is equivalent to ~ids.indexOf(id) != 0
. But arr.some()
and !arr.every()
have a different semantics:
some()
returns true
if at least one element fits the condidition!every()
returns true
if at least one element doesn't fit the conditionSo actually your first snippet is not checking, if there is at least one element in arr
that is also contained in ids
, but if there is at least one element in arr
that is not contained in ids
So the correct version of first snippet would be
const invalid = !arr.every((id) => !(~ids.indexOf(id)));
Ie, checkig if not every element of arr
is not contained in ids
. From a computational standpoint, they are more or less the same:
indexOf
and includes
return on the first element element they findsome
stops when the callback returns true
for the first timeevery
stops when the callback returns false
for the first time~
and !
But if you compare this to your second snippet, it seems pretty obvious, that it is far more complex to read and understand and therefore far more complex to maintain.
const
arr = [1,2,3],
ids = [1,2,3,4,5,6]
const
i1 = !arr.every((id) => ~ids.indexOf(id)),
i2 = arr.some((id) => ids.includes(id)),
i3 = !arr.every((id) => !(~ids.indexOf(id)));
console.log(i1, i2, i3)
Upvotes: 2