В этой серии статей я рассмотрю некоторые сокращения кода и профессиональные советы для тех, кто погружается в JavaScript на платформе ServiceNow, а также для экспертов, которые застряли в своих обычных методах и практиках и хотели бы добавить некоторые новые виды оружия в свои навыки. арсенал. В этой статье я более подробно рассмотрю одно из мощных средств, имеющихся в нашем распоряжении: метод .forEach. Я подробно расскажу о том, как это работает, о его преимуществах и недостатках. Наконец, мы рассмотрим интересную возможность, недавно добавленную в набор инструментов сценариев ServiceNow вместе с Tokyo, и поддержку более новых версий ECMAScript, появившихся в Tokyo Release.

.forEach?

.forEach — это метод, который легко доступен в прототипе Array в JavaScript. Его основная роль заключается в том, чтобы дать разработчикам возможность перебирать каждый элемент, присутствующий в массиве, что позволяет им выполнять определенную операцию или комбинацию операций над этими элементами. При использовании этого метода необходимо включить функцию, часто известную как функция обратного вызова. Этот обратный вызов вызывается для каждого элемента в массиве.

Для тех, кто интересуется техническими подробностями, синтаксис представлен как:

array.forEach(function(currentValue, index, arr), thisValue)

Вот краткое описание параметров:
- currentValue означает, что текущий элемент обрабатывается.
- index – это позиция этого элемента в массиве. .
arr относится к исходному массиву, для которого был вызван .forEach.
— наконец, thisValue — это объект, на который может указывать ключевое слово this внутри функции обратного вызова.

Плюсы и минусы .forEach в ServiceNow

Говоря о преимуществах использования .forEach в ServiceNow, можно выделить несколько:

- Код становится заметно понятнее. Это связано с тем, что намерение выполнить цикл по каждому элементу массива прямо указано в .forEach.
— Примечательно отсутствие необходимости в счетчиках циклов. Это отсутствие означает, что разработчики могут обойти задачу поддержки лишней переменной-счетчика циклов, что впоследствии снизит вероятность ошибок.
 – Это способствует цепочке, .forEach можно умело сочетать с другими методами массива. такие как .map(), .filter() и другие, что приводит к мощным и кратким операциям.

Однако, как и любой инструмент или метод, .forEach не лишен недостатков:

– При обсуждении производительности традиционные циклы for иногда опережают .forEach. Это в первую очередь потому, что последний не имеет багажа вызовов функций, которых нет в циклах for.
Важно отметить, что внутри .forEach нельзя разверните операторы break или continue. Это ограничение может быть сдерживающим, особенно если есть требование преждевременно завершить цикл или обойти определенную итерацию цикла.
 – Непредвиденным недостатком могут быть побочные эффекты. Есть вероятность, что функция обратного вызова порождает побочные эффекты, усложняющие процесс отладки.

Пример

Представьте себе сценарий, в котором в ServiceNow есть список записей пользователей, и задача состоит в том, чтобы извлечь их соответствующие адреса электронной почты.

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

var userRecords = [
 {name: 'Erling Haaland', email: '[email protected]'},
 {name: 'Viktor Hovland', email: '[email protected]'},
 // … other records
];
var userEmails = [];
for (var i = 0; i < userRecords.length; i++) {
 userEmails.push(userRecords[i].email);
}
console.log(userEmails);

Принятие .forEach повышает ясность намерений кода и устраняет счетчик циклов. Выглядит примерно так:

var userRecords = [
{name: 'Erling Haaland', email: '[email protected]'},
 {name: 'Viktor Hovland', email: '[email protected]'},
    // ... other records
];

var userEmails = [];

userRecords.forEach(function(user) {
    userEmails.push(user.email);
});

Однако важно помнить, что обе методологии имеют свои достоинства. Решение о том, что использовать, часто диктуется конкретным вариантом использования и, конечно же, личными предпочтениями разработчика.

Сочетание со стрелочным обозначением

Чтобы сделать еще один шаг вперед, мы можем использовать новую поддержку ECMAScript и, следовательно, стрелочную нотацию. Функция стрелки обеспечивает более лаконичный способ определения обратного вызова для метода .forEach. Синтаксис user => userEmails.push(user.email) эквивалентен определению функции в первом примере, но он короче и может сделать код чище, особенно при работе с короткими функциями обратного вызова. Давайте сразу перейдем к примеру.

var userRecords = [
{name: 'Erling Haaland', email: '[email protected]'},
{name: 'Viktor Hovland', email: '[email protected]'},
    // ... other records
];
var userEmails = [];
userRecords.forEach(user => userEmails.push(user.email));
console.log(userEmails);

Заключение

Несмотря на то, что .forEach предлагает элегантный способ обхода массивов в JavaScript и повышает прозрачность и лаконичность кода, я заметил в своей работе, что коллеги широко не используют его, и многие до сих пор возвращаются к верный старый, но утомительный, для индексированных циклов for. В следующий раз, когда вы обнаружите, что пишете код, который перебирает массив, попробуйте! Вы даже можете произвести впечатление на коллегу или двух :)