Метод filter() в Google apps script

Общая информация

Метод filter () массива используется для фильтрации массива на основе набора условий. Этот метод возвращает новый массив с отфильтрованными значениями.

Синтакс

Array.filter(callbackFunction)

Параметры callbackFunction

Функция вызывается для каждого элемента массива. Если функция возвращает true, то элемент остаётся в массиве, если false, то удаляется.
В функцию может будет передано три аргумента:
element — Текущий обрабатываемый элемент в массиве.
index (Необязательный) — Индекс текущего обрабатываемого элемента в массиве.
array (Необязательный) — Массив, по которому осуществляется проход.
thisArg (Необязательный) — Значение, используемое в качестве this при вызове функции callback.

Как это работает?

Проще всего показать на примерах:

Пример 1

Первое что необходимо, это создать массив:

const basicArray = [['a','b','c','d'],1,2,3,4,5,6,7,8,9, 'aaa',10];

Так как метод filter возвращает новый массив, его необходимо так же объявить:

const filteredArray = basicArray.filter(arrFilter);

где, arrFilter есть ни что иное как колл-бэк функция для каждого элемента массива

Напишем функцию:

function arrFilter(value) {
return value > 5;
}

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

function arrFilterBasics() {
const basicArray = [['a','b','c','d'],1,2,3,4,5,6,7,8,9, 'aaa',10];
const filteredArray = basicArray.filter(arrFilter);
console.log(basicArray);

console.log(filteredArray);
}

Пример 1 упрощенный

колл-бэк функцию можно обернуть в стрелочную функцию:

const filteredArray = basicArray.filter(value => value > 5);

c абсолютно тем же результатом:

Это изображение имеет пустой атрибут alt; его имя файла - image-9.png

Пример 2

На основе существующей таблицы с данными по акциям, создадим новый фильтрованный массив

Таблица с данными по акциям

Прежде всего надо «затянуть» таблицу в массив:

function myFunction() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const activeSheet = ss.getSheetByName('Stockdata');
const workingArray = activeSheet.getDataRange().getValues();
console.log(workingArray);
}

посмотрим на логи:

Видно, что каждый элемент массива это тоже массив: [[arr1], [arr2],[arr3],[arr4],[arr5],[….],[arr_n]]

Допустим, нужно получить список акций, цена которых выражена в USD

USD является вторым элементом вложенного массива:

[ ‘Abbott Laboratories’, ‘ABT’, ‘USD’, 118.04, 128.54, 91.5, 117.15, 116.92, 0.918313365489342, », », 0.911389450754629, ‘Здравоохранение’ ],

Так как нумерация элементов начинается с 0, соответственно ‘Abbott Laboratories’ — 0 , ‘ABT’ — 1 ‘USD’ — 2

Добавляем колл-бэк функцию

const filteredArray = workingArray.filter(filterResults);

Теперь сама функция, где я буду обращаться к item[2], то есть по сути заходить в каждый вложенный массив и брать второй элемент этого массива:

function filterResults(item) {
return item[2] === 'USD';
}

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

[ [ '10X Genomics Inc', 'TXG', 'USD', 190.94, 208.99, 85.74, 189.94, 191.59, 0.9136322312072347, '', '', 0.9088473132685774, 'Здравоохранение' ], [ 'Abbott Laboratories', 'ABT', 'USD', 118.04, 128.54, 91.5, 117.15, 116.92, 0.918313365489342, '', '', 0.911389450754629, 'Здравоохранение' ], [ 'Adobe Inc', 'ADBE', 'USD', 593.07, 594.08, 416.29, 584.73, 588.67, 0.9982998922704013, '', '', 0.9842613789388635, 'ИТ' ], [ 'Advanced Micro Devices, Inc.', 'AMD', 'USD', 94.7, 99.23, 52.05, 93.31, 93.28, 0.9543484833215762, '', '', 0.9403406227955255, 'ИТ' ], [ 'Alibaba Group Holding Ltd - ADR', 'NYSE:BABA', 'USD', 217.75, 319.32, 204.39, 221.87, 219.16, 0.6819178253789302, '', '', 0.6948202430164099, 'ИТ' ], [ 'Amazon.com, Inc.', 'AMZN', 'USD', 3510.98, 3554, 2871, 3432.97, 3451.64, 0.9878953292065279, '', '', 0.965945413618458, 'ИТ' ], [ 'American Airlines Group Inc', 'AAL', 'USD', 21.48, 26.09, 10.63, 21.51, 21.62, 0.8233039478727482, '', '', 0.8244538137217325, 'Транспорт' ] ]

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