Класс DataTable предназначен для работы с табличными данными. Он обеспечивает хранение и обработку структурированных данных, поддерживая операции фильтрации, сортировки, группировки и агрегации. Полный список доступных операций приведен в таблице Методы.
Обработка данных осуществляется через методы объекта DataTable. Многие методы DataTable поддерживают конвейерный способ вызова, что позволяет вызывать несколько методов подряд. Это делает код более лаконичным и читаемым, а также упрощает сложную обработку данных.
Прямое изменение коллекции колонок через свойство columns не рекомендуется, так как это может привести к рассогласованию структуры таблицы и данных в строках. Вместо этого следует использовать специальные методы для изменения структуры таблицы, такие как добавление или удаление колонок.
Объект DataTable может быть создан при помощи функции createTable или путем инициализации объекта с помощью ключевого слова new. Также объект DataTable возвращается в качестве результата запросов к БД.
Создает таблицу данных. Предусмотрено три варианта синтаксиса. Описание структуры колонок может быть передано в виде массива объектов, массива строковых описаний или единого строкового описания.
createTable(columnSettings)
или
или
DataTable
В данном примере создается таблица, содержащая четыре колонки: product, quantity, amount и is_available. Колонка quantity по умолчанию имеет значение 1. Для колонки явно не указан тип данных, и по-умолчанию данной колонке назначается тип ‘string’.
createTable([
{name: 'product'},
{name: 'quantity', dataType: 'number', defaultValue: 1},
{name: 'amount', dataType: 'number'},
{name: 'is_available', dataType: 'boolean'}
])
Более компактный вариант синтаксиса. В качестве параметров передается массив строковых описаний колонок. Описание колонки должно соответствовать формату: ‘name <dataType>’. Обращаем внимание, что установка значения по-умолчанию в данном варианте синтаксиса не предусмотрена.
createTable(['product', 'qauntity number', 'amount number', 'is_available boolean'])
Компактный вариант синтаксиса. В качестве параметра передается строковое описание колонок таблицы. Описания отдельных колонок разделены запятыми.
createTable('product, qauntity number, amount number, is_available boolean')
Метод | Возвращает | Описание |
---|---|---|
addColumn | DataTable | Добавление колонки в таблицу |
addRow | DataTable | Добавление строки в таблицу |
avg | DataTable | Вычисление среднего по колонке таблицы |
clear | DataTable | Очистка строк таблицы |
clone | DataTable | Создание копии таблицы |
count | DataTable | Подсчет количества строк в таблице |
deleteColumn | DataTable | Удаление колонки таблицы |
distributeFifo | DataTable | Распределение FIFO |
distributeLifo | DataTable | Распределение LIFO |
innerJoin | DataTable | Внутреннее соединение таблиц |
filter | DataTable | Фильтрация строк таблицы |
fullJoin | DataTable | Полное внешнее соединение таблиц |
getColumn | DataTableColumn | Поиск колонки таблицы по имени |
groupBy | DataTable | Группировка таблицы |
leftJoin | DataTable | Левое внешнее соединение таблиц |
load | DataTable | Добавление данных в таблицу |
max | DataTable | Вычисление максимума по колонке таблицы |
min | DataTable | Вычисление минимума по колонке таблицы |
newRow | Object | Создание новой строки таблицы |
rightJoin | DataTable | Правое внешнее соединение таблиц |
process | DataTable | Обработка строк таблицы |
orderBy | DataTable | Сортировка строк таблицы |
sum | DataTable | Вычисление суммы по колонке таблицы |
union | DataTable | Объединение уникальных строк таблиц |
unionAll | DataTable | Объединение всех строк таблиц |
Добавляет колонку в таблицу. Конфигурация колонки может передана в виде объекта или в виде строкового описания.
dataTable.addColumn(column)
или
DataTable
Конфигурация колонки передается в виде объекта.
createTable().addColumn({ name: 'period', dataType: 'date'})
Конфигурация колонки передается в виде строкового описания.
createTable().addColumn('period date')
Добавляет строку в таблицу. Данные строки могут быть переданы в виде массива значений. В этом случае важно соблюдать позицию значения в массиве. Кроме того данные могут быть переданы в виде объекта. Пропущенные значения будут инициализированы значениями по-умолчанию.
dataTable.addRow(data)
или
DataTable
// Создание таблицы
var tableRates = createTable([{ name: 'period', dataType: 'date'}, { name: 'person'}, { name: 'rate', dataType: 'number'}, { name: 'isWorking', dataType: 'boolean'}])
// Добавление строки таблицы. Данные передаются в виде массива значений. Важна соблюдать позицию значения в массиве.
.addRow(['2024-09-01', 'Person 1', 1000, true])
// Добавление строки таблицы. Данные передаются в виде объекта.
.addRow({person: 'Person 2', period: '2024-08-01', isWorking: false, rate: 2000});
return tableRates;
Вычисляет среднее значений по указанной колонке таблицы.
dataTable.min(columnName)
number
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
]);
// Вычисление среднего по колонке 'rate'.
return tableRates.avg('rate');
Очищает строки таблицы. Колонки остаются неизменными.
dataTable.clear()
нет
DataTable
Создает копию таблицы. Копируется как структура таблицы (колонки) так и данные.
dataTable.clone()
нет
DataTable
// Создание таблицы товаров и добавление строки в таблицу.
var productsTable = createTable([{ name: 'product'}, { name: 'quantity', dataType: 'number'}]).addRow(['product 1', 100]);
// Создание копии таблицы и добавление новой колонки. Таблица товаров productsTable остается неизменной.
var copyTable = productsTable.clone().addColumn({ name: 'amount', dataType: 'number'});
return copyTable;
Подсчитывает количество строк в таблице. Если указано имя колонки, подсчитываются только строки, в которых значения в указанной колонке не пустые. Проверка на заполненность значений выполняется в соответствии с правилами JavaScript, где значения null, undefined, пустая строка (‘’), 0, false считаются пустыми.
dataTable.count(columnName)
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
]);
// Вычисление количества строк с заполненным полем isWorking.
return tableRates.count('isWorking');
Удаляет колонку таблицы.
dataTable.deleteColumn(columnName)
DataTable
createTable([{ name: 'product'}, { name: 'quantity', dataType: 'number'}, { name: 'price', dataType: 'number'}])
.addRow(['product 1', 100, 10]).deleteColumn('quantity')
Фильтрует строки таблицы на основе заданного условия. Условие передается в виде стрелочной функции (предиката), которая принимает строку таблицы в качестве аргумента и возвращает логическое значение (true или false). Если предикат возвращает true, строка включается в результат фильтрации, в противном случае строка исключается.
dataTable.filter(predicate)
DataTable
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
['2024-09-01', 'Person 1', 1000, true],
['2024-09-01', 'Person 2', 2000, true],
['2024-09-01', 'Person 3', 3000, true],
['2024-09-01', 'Person 4', 4000, true],
])
// Выполнение фильтрации.
.filter(row=> row.rate > 2000)
return tableRates;
Выполняет поиск колонки по имени.
dataTable.getColumn(columnName)
DataTableColumn
// Создание таблицы товаров и добавление строки в таблицу.
var productsTable = createTable([{ name: 'product'}, { name: 'quantity', dataType: 'number'}]).addRow(['product 1', 100]);
// Поиск колонки по имени.
var column = productsTable.getColumn('quantity');
return column;
Выполняет группировку строк таблицы по указанным ключевым колонкам и применяет агрегатные функции к выбранным колонкам.
dataTable.groupBy(keyColumns, groupingColumns)
DataTable - сгруппированная таблица данных.
// Создание таблицы.
var tableProducts = createTable(
[{name: 'product'}, { name: 'product_group'}, { name: 'store'}, { name: 'quantity', dataType: 'number'}])
// Заполнение таблицы данными.
.load([
['Product 1', 'Group 1', 'Store 1', 86],
['Product 19', 'Group 3', 'Store 3', 89],
['Product 16', 'Group 4', 'Store 1', 75],
['Product 14', 'Group 2', 'Store 1', 18],
['Product 12', 'Group 2', 'Store 3', 77],
['Product 25', 'Group 3', 'Store 2', 32]
])
// Выполнение группировки по полю product_group c вычисленим различных агрегатных функций.
.groupBy(['product_group'], [
'quantity',
{name: 'quantity', alias:'q_max', aggregate:'max'},
{name: 'quantity', alias:'q_min', aggregate:'min'},
{name: 'quantity', alias:'q_avg', aggregate:'avg'},
{name: 'quantity', alias:'q_count', aggregate:'count'}
]);
return tableProducts;
Добавляет данные в таблицу. Данные могут быть переданы в виде массива, содержащего массивы значений полей строк или массива объектов. Допускается смешение массивов значений и объектов в рамках одного набора данных.
dataTable.load(data)
DataTable
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу. Первая строка передается как массив значений полей строки.
// В этом случае важно соблюдать порядок значений.
// Вторая строка добавляется в виде объекта.
.load([
['2024-09-01', 'Person 1', 1000, true],
{ person: 'Person 2', period: '2024-08-01', isWorking: false, rate: 2000}
])
return tableRates;
Создает новую строку таблицы и заполняет значениями по умолчанию.
dataTable.newRow(pushNewRow)
-pushNewRow (необязательный): boolean - указывает на необходимость поместить новую строку в коллекцию строк таблицы. Значение по умолчанию: true.
Object
Создает новую строку в таблице, заполняет значениями по умолчанию и помещает новую строку в коллекцию колонок таблицы.
createTable([{ name: 'product'}, { name: 'quantity', dataType: 'number'}]).newRow();
Сортирует строки таблицы на основе заданного условия. Условие сортировки передается в виде стрелочной функции (компаратора), которая сравнивает две строки таблицы и возвращает число для определения порядка их следования.
dataTable.orderBy(comparator)
DataTable — возвращает текущий объект DataTable с отсортированными строками.
Выполнение сортировки по числовой колонке по возрастанию.
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
['2024-09-01', 'Person 2', 2000, true],
['2024-05-01', 'Person 3', 3000, true],
['2024-11-01', 'Person 1', 1000, false],
['2024-04-01', 'Person 4', 4000, true],
])
// Выполнение сортировки по колонке rate по возрастанию.
.orderBy( (a, b)=> a.rate - b.rate)
return tableRates;
Выполнение сортировки по колонке дат по убыванию.
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
])
// Выполнение сортировки по колонке period по убыванию.
.orderBy( (a, b)=> b.period.getTime() - a.period.getTime())
return tableRates;
Вычисляет максимальное значение по указанной колонке таблицы.
dataTable.max(columnName)
number
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
]);
// Вычисление максимума по колонке 'rate'.
return tableRates.max('rate');
Вычисляет минимальное значение по указанной колонке таблицы.
dataTable.min(columnName)
number
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
]);
// Вычисление минимума по колонке 'rate'.
return tableRates.min('rate');
Обрабатывает строки таблицы, выполняя переданную стрелочную функцию для каждой строки. Функция может изменять содержимое строки или выполнять другие операции.
dataTable.process(action)
DataTable - возвращает текущий объект DataTable, что позволяет использовать метод в цепочке вызовов.
// Создание таблицы.
var tableProducts = createTable([
{ name: 'product'},
{ name: 'price', dataType: 'number'},
{ name: 'quantity', dataType: 'number'},
{ name: 'amount', dataType: 'number'}])
// Заполнение данных таблицы.
.load([['Product 1', 100, 5], ['Product 2', 200, 10]])
// Вычисление значения в колонке amount.
.process(row=> row.amount = row.quantity * row. price);
return tableProducts;
Вычисляет сумму значений по указанной колонке таблицы.
dataTable.sum(columnName)
number
// Создание таблицы.
var tableRates = createTable([
{ name: 'period', dataType: 'date'},
{ name: 'person'},
{ name: 'rate', dataType: 'number'},
{ name: 'isWorking', dataType: 'boolean'}])
// Добавление данных в таблицу.
.load([
[new Date('2024-09-01'), 'Person 2', 2000, true],
[new Date('2024-05-01'), 'Person 3', 3000, true],
[new Date('2024-11-01'), 'Person 1', 1000, false],
[new Date('2024-04-01'), 'Person 4', 4000, true],
]);
// Вычисление суммы по колонке 'rate'.
return tableRates.sum('rate');
Осуществляет объединение текущей таблицы с другой таблицей, добавляя только уникальные строки. В отличие от unionAll, выполняется проверка на уникальность строк, что может замедлять выполнение, но гарантирует отсутствие дубликатов.
dataTable.union(tableToUnion)
DataTable - Объединённая таблица, содержащая уникальные строки из обеих таблиц.
Данный пример демонстрирует объединение двух таблиц. Строка [‘product_1’, 10, 100] в обеих таблицах одинаковая, поэтому она не будет добавлена второй раз. Однако строка [‘product_3’, 20, 4000] будет добавлена, так как она уникальна.
// Определение колонок таблиц.
var columns = [{name: 'product'}, {name: 'quantity', dataType: 'number'}, {name: 'amount', dataType: 'number'}];
// Создание основной таблицы.
var mainTable = createTable(columns)
.addRow(['product_1', 10, 100])
.addRow(['product_2', 5, 2000]);
// Создание таблица для объединения.
var tableToUnion = createTable(columns)
.addRow(['product_1', 10, 100])
.addRow( ['product_3', 20, 4000]);
// Выполнение объединения таблиц.
return mainTable.union(tableToUnion);
Осуществляет объединение текущей таблицы с другой таблицей, добавляя все строки. В отличие от union, проверка на уникальность строк не выполняется.
dataTable.union(tableToUnion)
DataTable - Объединённая таблица, содержащая все строки из обеих таблиц.
Данный пример демонстрирует объединение двух таблиц. Строка [“product_1”, 10, 100] в обеих таблицах одинаковая, поэтому в результирующей таблице она будет задублирована.
// Определение колонок таблиц.
var columns = [{name: 'product'}, {name: 'quantity', dataType: 'number'}, {name: 'amount', dataType: 'number'}];
// Создание основной таблицы.
var mainTable = createTable(columns)
.addRow(['product_1', 10, 100])
.addRow(['product_2', 5, 2000]);
// Создание таблица для объединения.
var tableToUnion = createTable(columns)
.addRow(['product_1', 10, 100])
.addRow( ['product_3', 20, 4000]);
// Выполнение объединения таблиц.
return mainTable.unionAll(tableToUnion);