skip to content
Alvin Lucillo

Gotcha in TS/JS

/ 2 min read

💻 Tech

There’s a problem with the output. The objective of the code below is to have show=true for the numbers in data1 that don’t exist in data2. However, the output shows 0 with true as well apart from 2.

The problem with it is with the negation !data2.find(j => j === i). find operation returns the value if it exists; otherwise, it returns undefined. For numbers 1,2,4,5, they are returned as-is, and therefore, when negated, the value will be true. This is because those values are ‘truthy’. On the other hand, 2 doesn’t exist in the other array, that’s why it’s undefined and negated to false because undefined is ‘falsy’. With 0, it exists that’s why it’s returned as 0; however, 0 is falsy, so negating it will return true.

To resolve the issue, we can directly check for undefined value instead of negating the result. Solution: showList.push({i: i, show: data2.find(j => j === i) == undefined} as item);.

index.ts:

const data1: number[] = [ 0, 1, 2, 3, 4, 5]; // list of complete numbers
const data2: number[] = [ 0, 1, 2, 4, 5 ]; // list of existing numbers (3 is missing)

interface item { i: number, show: boolean}
let showList: item[] = [];

data1.forEach(i => {
    showList.push({i: i, show: !data2.find(j => j === i)} as item);
});

console.log(showList);

output:

[
  { i: 0, show: true },
  { i: 1, show: false },
  { i: 2, show: false },
  { i: 3, show: true },
  { i: 4, show: false },
  { i: 5, show: false }
]