Google Apps Script: Как Найти Элемент в Массиве?

Что такое массив и зачем нужен поиск элементов?

Массив в Google Apps Script (как и в любом другом языке программирования) представляет собой упорядоченную коллекцию элементов. Эти элементы могут быть различных типов данных: числа, строки, булевы значения, объекты и даже другие массивы. Поиск элемента в массиве — это фундаментальная операция, которая необходима для решения широкого круга задач, таких как:

Проверка наличия определенного значения в списке.

Извлечение информации, связанной с найденным элементом.

Фильтрация данных на основе определенных критериев.

Реализация алгоритмов поиска и сортировки.

Без эффективных методов поиска работа с массивами была бы крайне затруднительной.

Обзор основных методов поиска: краткое сравнение

В Google Apps Script существует несколько встроенных методов для поиска элементов в массивах. Основные из них:

indexOf(): Находит первое вхождение указанного элемента в массиве и возвращает его индекс. Если элемент не найден, возвращает -1.

includes(): Проверяет, содержит ли массив указанный элемент, и возвращает true или false.

find(): Возвращает значение первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. Если ни один элемент не удовлетворяет условию, возвращает undefined.

findIndex(): Возвращает индекс первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. Если ни один элемент не удовлетворяет условию, возвращает -1.

Выбор метода зависит от конкретной задачи: нужно ли знать индекс элемента, достаточно ли просто проверить его наличие, или требуется поиск по сложным критериям.

Метод indexOf(): поиск первого вхождения элемента

Синтаксис и параметры метода indexOf()

Синтаксис метода indexOf() достаточно прост:

array.indexOf(searchElement[, fromIndex])

searchElement: Элемент, который нужно найти в массиве. Может быть любого типа данных.

fromIndex (необязательный): Индекс, с которого начинается поиск. Если не указан, поиск начинается с начала массива (индекс 0). Если индекс больше или равен длине массива, возвращается -1, так как массив не будет просматриваться. Если предоставленное значение индекса отрицательное, то поиск в массиве начинается с конца массива.

Примеры использования indexOf() для поиска различных типов данных (строки, числа, булевы значения)

/**
 * Пример поиска строки в массиве строк.
 */
function findStringIndex() {
  const myArray: string[] = ['apple', 'banana', 'orange', 'banana'];
  const index: number = myArray.indexOf('banana');
  Logger.log(index); // Вывод: 1 (первое вхождение 'banana')

  const notFoundIndex: number = myArray.indexOf('grape');
  Logger.log(notFoundIndex); // Вывод: -1 (элемент не найден)
}

/**
 * Пример поиска числа в массиве чисел.
 */
function findNumberIndex() {
  const numbers: number[] = [10, 20, 30, 20];
  const index: number = numbers.indexOf(20);
  Logger.log(index); // Вывод: 1
}

/**
 * Пример поиска булевого значения в массиве булевых значений.
 */
function findBooleanIndex() {
  const boolArray: boolean[] = [true, false, true];
  const index: number = boolArray.indexOf(true);
  Logger.log(index); // Вывод: 0
}

Обработка случая, когда элемент не найден (возвращаемое значение -1)

Крайне важно проверять, был ли найден элемент, прежде чем выполнять какие-либо действия с его индексом. indexOf() возвращает -1, если элемент не найден. Пример:

function findAndProcess() {
  const products: string[] = ['productA', 'productB', 'productC'];
  const searchTerm: string = 'productD';

  const index: number = products.indexOf(searchTerm);

  if (index !== -1) {
    Logger.log(`Элемент ${searchTerm} найден по индексу ${index}.`);
    // Выполните действия, связанные с найденным элементом.
  } else {
    Logger.log(`Элемент ${searchTerm} не найден в массиве.`);
    // Обработайте случай, когда элемент не найден.
  }
}

Метод includes(): проверка наличия элемента в массиве

Синтаксис и параметры метода includes()

Метод includes() имеет следующий синтаксис:

array.includes(searchElement[, fromIndex])

searchElement: Элемент, который нужно проверить на наличие в массиве.

fromIndex (необязательный): Индекс, с которого начинается поиск. Работает аналогично indexOf(). Если fromIndex больше или равен длине массива, возвращается false. Если индекс отрицательный, поиск начинается с конца массива.

Примеры использования includes() для простой проверки существования элемента

function checkIfExists() {
  const users: string[] = ['user1', 'user2', 'user3'];

  const userExists: boolean = users.includes('user2');
  Logger.log(userExists); // Вывод: true

  const userNotExists: boolean = users.includes('user4');
  Logger.log(userNotExists); // Вывод: false
}

function checkIfExistsFromIndex() {
 const data: number[] = [1, 2, 3, 4, 5, 3];

 const existsFromIndex: boolean = data.includes(3, 3);
 Logger.log(existsFromIndex); // Вывод: true, так как 3 найдено начиная с индекса 3

 const notExistsFromIndex: boolean = data.includes(1, 1); // ищем 1 начиная с индекса 1
 Logger.log(notExistsFromIndex); // Вывод: false
}

Разница между indexOf() и includes(): когда какой метод использовать?

includes() используется, когда нужно просто проверить, существует ли элемент в массиве. Он возвращает true или false и не предоставляет информации об индексе элемента.

indexOf() используется, когда нужно узнать индекс первого вхождения элемента в массиве. Если индекс не нужен, а важен только факт существования, includes() обычно предпочтительнее из-за его большей лаконичности и читаемости.

Реклама

Поиск объектов в массиве: использование методов find() и findIndex()

Синтаксис и параметры методов find() и findIndex()

Для поиска объектов в массиве по определенным критериям используются методы find() и findIndex(). Оба метода принимают в качестве аргумента callback-функцию, которая определяет условие поиска.

array.find(callback(element[, index[, array]])[, thisArg])
array.findIndex(callback(element[, index[, array]])[, thisArg])

callback: Функция, которая вызывается для каждого элемента в массиве. Она принимает три аргумента:

element: Текущий элемент массива.

index (необязательный): Индекс текущего элемента.

array (необязательный): Массив, по которому выполняется итерация.
Callback-функция должна возвращать true, если элемент соответствует условию поиска, и false в противном случае.

thisArg (необязательный): Значение, используемое в качестве this при выполнении callback-функции.

Примеры поиска объектов по определенным свойствам (например, поиск пользователя по ID)

/**
 *  Определяем интерфейс для объекта User.
 */
interface User {
  id: number;
  name: string;
  email: string;
}

function findUserById() {
  const users: User[] = [
    { id: 1, name: 'Alice', email: 'alice@example.com' },
    { id: 2, name: 'Bob', email: 'bob@example.com' },
    { id: 3, name: 'Charlie', email: 'charlie@example.com' },
  ];

  const userIdToFind: number = 2;

  const foundUser: User | undefined = users.find(user => user.id === userIdToFind);

  if (foundUser) {
    Logger.log(`Найден пользователь: ${foundUser.name} (${foundUser.email})`);
  } else {
    Logger.log(`Пользователь с ID ${userIdToFind} не найден.`);
  }
}

function findUserIndexById() {
  const users: User[] = [
    { id: 1, name: 'Alice', email: 'alice@example.com' },
    { id: 2, name: 'Bob', email: 'bob@example.com' },
    { id: 3, name: 'Charlie', email: 'charlie@example.com' },
  ];

  const userIdToFind: number = 2;

  const foundUserIndex: number = users.findIndex(user => user.id === userIdToFind);

  if (foundUserIndex !== -1) {
    Logger.log(`Найден пользователь по индексу: ${foundUserIndex}`);
  } else {
    Logger.log(`Пользователь с ID ${userIdToFind} не найден.`);
  }
}

Использование callback-функций для более сложных условий поиска

Callback-функции могут содержать более сложные условия, включающие несколько свойств объекта или логические операторы.

function findUserByEmailDomain() {
  const users: User[] = [
    { id: 1, name: 'Alice', email: 'alice@example.com' },
    { id: 2, name: 'Bob', email: 'bob@gmail.com' },
    { id: 3, name: 'Charlie', email: 'charlie@example.com' },
  ];

  const domainToFind: string = 'gmail.com';

  const foundUser: User | undefined = users.find(user => user.email.endsWith(domainToFind));

  if (foundUser) {
    Logger.log(`Найден пользователь с email на домене ${domainToFind}: ${foundUser.name}`);
  } else {
    Logger.log(`Пользователь с email на домене ${domainToFind} не найден.`);
  }
}

Сравнение find() и findIndex(): получение элемента или его индекса

find() возвращает сам элемент, который соответствует условию поиска. Если ни один элемент не найден, возвращает undefined.

findIndex() возвращает индекс элемента, который соответствует условию поиска. Если ни один элемент не найден, возвращает -1.

Если вам нужен сам объект, используйте find(). Если вам нужен индекс объекта, используйте findIndex().

Альтернативные методы и оптимизация поиска

Использование цикла for…of для ручного поиска (в каких случаях это полезно)

В некоторых случаях, особенно когда требуется выполнить сложные операции во время поиска или прервать поиск при выполнении определенного условия, использование цикла for...of может быть более подходящим, чем встроенные методы.

function manualSearch() {
  const data: number[] = [1, 2, 3, 4, 5];
  const target: number = 3;
  let foundIndex: number = -1;

  for (const [index, value] of data.entries()) {
    if (value === target) {
      foundIndex = index;
      break; // Прерываем цикл, если элемент найден
    }
  }

  if (foundIndex !== -1) {
    Logger.log(`Элемент ${target} найден по индексу ${foundIndex}`);
  } else {
    Logger.log(`Элемент ${target} не найден`);
  }
}

Советы по оптимизации поиска в больших массивах

Использование правильной структуры данных: Если поиск выполняется часто, рассмотрите возможность использования объектов ({}) вместо массивов ([]) для хранения данных, где ключом будет значение, по которому выполняется поиск. Это позволит выполнять поиск за O(1) вместо O(n).

Сортировка массива: Если массив отсортирован, можно использовать алгоритмы бинарного поиска, которые значительно быстрее линейного поиска (используемого indexOf(), includes(), find() и findIndex()).

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

Применение библиотек и сторонних решений для более сложных сценариев поиска

Для более сложных сценариев поиска и обработки данных, таких как работа с большими объемами данных, сложными фильтрами или нечетким поиском, можно использовать сторонние библиотеки JavaScript, такие как Lodash или Underscore.js. Однако, следует помнить, что добавление сторонних библиотек увеличивает размер скрипта и может повлиять на производительность.


Добавить комментарий