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

#javascript #arrays #indexing #filter

#javascript #массивы #индексирование #Фильтр

Вопрос:

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

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

Мне пришлось использовать фильтр как часть задачи, и я понял, что 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"]```
 

Ответ №1:

Это утверждение неверно, filter() always returns true . Скорее filter позволит этим значениям пройти фильтр, для которого мы возвращаем 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 что равно false . Поэтому он отфильтровал 0-й элемент, и вы не получили этот элемент.

Комментарии:

1. Хорошо , спасибо, я думаю , что понимаю . Итак, в основном из-за того, что 0 равно false в условии фильтра, оно не возвращает 0 в индексе, если я не добавлю 1, что затем сделает его истинным?

2. Спасибо за вашу помощь, действительно ценю.

Ответ №2:

Вы могли бы взглянуть на нужные индексы, добавить один и взять оставшийся 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.log(...extractEachKth(nums, 3)); ["a", "b", "d", "e", "g", "h", "j"] 

Комментарии:

1. Это действительно полезно, потому что я пытался сделать что-то подобное, это подтверждает, что он добавляет 1 к 0, чтобы он прошел. Спасибо, что собрали это вместе.