Почему фильтр удаляет индекс 0 из моего массива

Я просто хотел подтвердить то, что меня беспокоит.

Я все еще изучаю javascript и сегодня сделал вызов. Задача состояла в том, чтобы удалить значение каждого второго индекса.

Мне пришлось использовать фильтр как часть задачи, и я понял, что index2 в приведенном ниже коде не возвращает индекс 0 из исходного массива, отсекая значение «a». Поэтому я заставил его работать, добавив 1 к каждому из индексов (index2 +1). Удаляет ли он 0, потому что filter() всегда возвращает true, а 0 рассматривается как false? Извините, я знаю, что это, вероятно, простой ответ, и спасибо всем, кто нашел время, чтобы помочь мне.

const nums = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
const index = 3;

const extractEachKth=(nums, index)=>nums.filter((item,index2)=>(index2 +1)%index!==0)

expected result ["a", "b", "d", "e", "g", "h", "j"]```

🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.


1
113
2

Ответы:

Решено

Это утверждение неверно, filter() always returns true. Скорее фильтр позволит тем значениям пройти фильтр, для которого мы возвращаем true. В вашем случае вы возвращаете true, если (index2 +1)%index!==0.

Когда index2 == 0, (index2 +1)%index!==0 => (0+1)%3 !== 0 => 1 !== 0, что верно. Поэтому он пропускает через фильтр 0-й элемент массива.

Раньше, когда вы не добавляли +1 к индексу2,

Когда index2 == 0, index2%index!==0 => 0%3 !== 0 => 0!== 0, что неверно. Поэтому он отфильтровал 0-й элемент, и вы не получили этот элемент.


Вы можете посмотреть индексы розыска, добавить один и взять остаток желаемого k из трех.

Результатом является число либо 1, 2 (оба правдивы ), либо ноль (это ложно).

Если это значение преобразовать в логическое, вы получите за один и два true и за ноль false.

const
    nums = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
    //       0    1         3    4         5    6         7  wanted indices
    //       1    2    3    4    5    6    7    8    9   10  all index + 1
    //       1    2    0    1    2    0    1    2    0    1  sum % 3
    //       *    *         *    *         *    *         *  take this truthy values
    extractEachKth = (nums, k) => nums.filter((_, index) => (index + 1) % k);


console.info(...extractEachKth(nums, 3)); ["a", "b", "d", "e", "g", "h", "j"]