JavaScript выполнить что-то только один раз при скролле

Есть функция, следящая за скроллом страницы. Страница состоит из множества блоков, у каждого уникальный ID. Если какой-то блок попадает в видимую область страницы, то его ID должен записываться в массив mass. Проблема в том, что сейчас у меня ID блока добавляется в массив не один раз при его появлении, а постоянно при скролле, пока этот блок виден на странице. Весь код приводить не буду, приведу часть, которую необходимо подправить, а у меня не хватает знаний. Второе - если какой-то блок уходит из видимой области - его ID нужно из массива удалить. По идее это mass.shift, поскольку блоки идут один за одним, но не работает тоже. Заранее спасибо!

if( ... тут условие видимости ... ){
    // если блок стал виден         
    mass.push(id);      
}else{
    // если уехал за границы
    mass.shift(id);
}
document.getElementById("mass").innerHTML = mass; // выводим массив для просмотра

Ответы (3 шт):

Автор решения: dresser

Можно попробовать так: mass[id] ? null : mass.push(id)

→ Ссылка
Автор решения: Narek

Если каждый блок имеет свой уникальный id, то перед добавлением в массив, можно использовать indexOf, который возвращает индекс заданного элемента. Например имеем такой массив x = [5,6,4,7,3], x.indexOf(4) вернёт 2 - индекс элемента 4 и остановится, а если не находит заданный элемент, то возвращает -1. То есть, в Вашем случае, можно написать так:

if( ... тут условие видимости ... ){
    // если блок стал виден       
    if (mass.indexOf(id) == -1){ //проверяем если такого элемента нет в массиве
         mass.push(id);
     }
 }
→ Ссылка
Автор решения: Pavel Grishaev

Вот с объектом вместо массива:

let obj = {}; // наш объект-хранилище

if( ... тут условие видимости ... ){
    // если блок стал виден         
    obj[id] = true;
}else{
    // если уехал за границы
    delete obj[id];
}

// выводим для просмотра:

document.getElementById("mass").innerHTML = JSON.stringify( obj, null, 4 );

// проверяем содержится ли уже:

if( obj[id] ) ...
→ Ссылка