Меня зовут Захария Мартин, и я изучаю программную инженерию в школе Flatiron.

В конце этапа 1 наших уроков нам необходимо выполнить проект, в котором мы создаем веб-страницу. Веб-страница должна получать доступ к данным с сервера API или JSON, должна иметь 3 отдельных прослушивателя событий и включать по крайней мере одно использование метода итерации массива, такого как карта, фильтр или forEach.

Для меня это последнее требование было самым сложным. Каждый перебирает массив и выводит что-то другое. Когда использовать каждый из них, может быть трудно понять, особенно когда вы сталкиваетесь с пустым файлом script.js и смутным представлением о том, что вы хотите, чтобы ваша веб-страница делала. В конце концов я понял, что forEach лучше всего подходит для того, что я пытался сделать. Здесь я объясню, что каждый из них делает, чтобы вы знали, когда их использовать.

для каждого

forEach — самый простой метод из трех. Он перебирает массив и выполняет функцию обратного вызова один раз для каждого элемента массива.

array.forEach((element) => { /*...*/ })

Например

const sampleArray = ['1', '2', '3'];

sampleArray.forEach(element => {
console.log(element * 2)
})

// expected output: "2"
// expected output: "4"
// expected output: "6"

Чтобы использовать пример из моего проекта фазы 1, я создал приложение, которое позволит вам искать монстров Dungeons and Dragons по их рейтингу опасности. Здесь я определил, что forEach — лучший метод итерации для использования, потому что мне нужно было запустить функцию обратного вызова только для элементов моего массива monsterObj, которые соответствуют определенным критериям. Здесь forEach перебирал каждого монстра в monsterObj, и если CR монстра был равен значению рейтинга опасности в раскрывающемся меню, то выполнялась функция renderOneMonsterIcon для этого элемента монстра.

let monsterObj

fetch("http://localhost:3000/monsterData")
.then(res => res.json())
.then(monsterData => monsterObj = monsterData)


document.getElementById('searchButton').addEventListener("click", () => {
  document.getElementById("monsterIconList").innerHTML = ''
  monsterObj.forEach(monster => {
      if (monster.cr.toString() === document.getElementById("challengeRating").value) {
      renderOneMonsterIcon(monster)
    }
  })
})

фильтр

Метод filter создает копию части данного массива, отфильтрованную только до тех элементов из данного массива, которые проходят проверку, реализованную предоставленной функцией.

array.filter((element) => { /* … */ })

Если тест, реализованный предоставленной функцией, возвращает true, то этот элемент помещается в массив подмножества, а затем продолжается итерация до следующего элемента. Если он возвращает false, он просто продолжает свою итерацию до следующего элемента.

Например

const words = ['grade', 'brochure', 'global', 'groups', 'section', 'office'];

const result = words.filter(word => word.length === 6);

console.log(result);
// expected output: Array ["global", "groups", "office"]

В своем проекте я сначала попытался использовать метод filter, перебирая массив monsterObj и применяя оператор if к элементам массива. Поскольку мне не нужна была копия отфильтрованного массива, а только для выполнения функции обратного вызова к элементам массива, forEach работал намного лучше, чем filter.

карта

Метод карты создает новый массив, заполненный результатами вызова предоставленной функции для каждого элемента массива.

array.map((element) => { /* … */ })

Например

const sampleArray = ["joe", "sam", "henry"];

const sampleArray2 = sampleArray.map(element => element.toUpperCase());

console.log(sampleArray2)

// expected output: Array ['JOE', 'SAM', 'HENRY']

Как и в случае с фильтром, вывод метода карты представляет собой массив. В отличие от filter, map возвращает массив одинаковой длины, применяя предоставленную функцию по очереди к каждому элементу и заполняя новый массив результатом.

Заключение

Основное различие между тремя методами заключается в возвращаемом значении каждого из них. Когда их использовать, определяется тем, какой результат вы хотите получить.

  • Метод карты возвращает новый массив равной длины, каждый элемент которого является результатом функции обратного вызова.
  • Метод filter возвращает копию части массива, отфильтрованную только до тех элементов массива, которые проходят проверку, реализованную предоставленной функцией. Если ни один элемент не пройдет проверку, будет возвращен пустой массив.
  • Метод forEach возвращает значение undefined, так как его целью является простое применение функции обратного вызова к каждому элементу массива.

Например,

Вам нужно, чтобы все зарплаты в массиве заработной платы увеличились на 1 доллар в час? Тогда может быть лучше использовать метод карты.

Вам нужен новый массив, содержащий только сотрудников, которым платят больше 18 долларов в час? Затем используйте метод фильтра.

Вам нужно выполнить функцию payEmployee для каждого сотрудника в массиве заработной платы? Затем используйте forEach.