Цикл `for of` переоценивает фильтрованный массив? - PullRequest
0 голосов
/ 14 марта 2019

Рассмотрим этот фрагмент кода javascript:

cont groups = [{ name: 'Sean', type: 'A' }, 
      { name: 'Jen', type: 'A' }, 
      { name: 'Tom', type: 'B'}]

for(const group of groups.filter(g => g.type === 'A')) {
    ...do some work
}

Будет ли цикл for переоценивать группы фильтровать каждую итерацию?Как можно было бы проверить это?В этом примере это не имеет большого значения, однако в больших коллекциях может быть важно вместо этого поднять операцию фильтрации в свою собственную переменную.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Нет, он не переоценивает каждую итерацию. Он делает это в начале. Цикл For ... работает с объектом итератора, который подсчитывает все элементы индекса внутри. Для каждой итерации вызывается метод итератора next () для получения следующего элемента. Для получения дополнительной информации об итераторах, пожалуйста, перейдите по этой ссылке

0 голосов
/ 14 марта 2019

Основываясь на предложении Пойнти в его комментарии, я сбросил console.log в обратный вызов фильтра. В приведенном ниже примере я сделал еще один шаг и использовал некоторую переменную count, чтобы убедиться, что она не переоценивает функцию фильтра на каждой итерации. Если бы это было так, я ожидал бы значение 6 (3 элемента в массиве, умноженное на 2 сопоставленных элемента)

const groups = [{ name: 'Sean', type: 'A' }, 
      { name: 'Jen', type: 'A' }, 
      { name: 'Tom', type: 'B'}]

let cnt = 0

for(const group of groups.filter(g => {
    console.log("I am here")
    cnt += 1
    return g.type === 'A'
  })) {
    document.getElementById("count1").value = cnt
}

cnt = 0

const filteredGroup = groups.filter(g => {
    console.log("I am here")
    cnt += 1
    return g.type === 'A'
  })

for(const group of filteredGroup) {
    document.getElementById("count2").value = cnt
}
<div>
  <label>Filter inline with for loop</label>
  <input type="text" id="count1" />
  <br />
  <br />
  <label>Filter set outside of loop</label>
  <input type="text" id="count2" />
  <br />
</div>

Это, кажется, подтверждает некоторые комментарии и ответ RK_15, который заключается в том, что он не переоценивает фильтр внутри for цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...