How to convert Matrix HTML to JSON in Typescript (for sending through api)
I have create the custom Matrix visual with some other features. But now I’m stuck in step to extract the data into JSON and send it through API! Below is its HTML code (although it is matrix but its structure HTML is table). Anyone have ideas how to convert Matrix HTML to Json? and can you please explain it more details! Many thanks for your help!
// This is my Matrix have to convert to JSON Northeast Southern California 5 6 Florida 10 15 // Below is HTML structure: Northeast Southern California 5 6 Florida 10 15
// My expect JSON format is like this: [ < "name_column_field": "Northeast", "value": 5, "name_row_field": "California" >, < "name_column_field": "Northeast", "value": 10, "name_row_field": "Florida" >, < "name_column_field": "Southern", "value": 6, "name_row_field": "California" >, < "name_column_field": "Southern", "value": 15, "name_row_field": "Florida" >]
asked Aug 12, 2019 at 16:12
Tung Nguyen Tung Nguyen
390 3 3 silver badges 13 13 bronze badges
1 Answer 1
For me, it’s easiest to think about this problem if we first have a nested array to represent our matrix.
const trs = document.getElementsByTagName("tr") const matrix = [] // a nested for loop to create our matrix for (let i = 0; i < trs.length; i++)< matrix.push([]) for (let j = 0; j < trs[i].children.length; j++)< matrix[i].push(trs[i].children[j].textContent) >> // console.log(matrix) to see what the nested arrays look like const obj = [] // nested loops to use our matrix to create our object // these will start a 1, because our labels are at index 0 for (let i = 1; i < trs.length; i++)< for (let j = 1; j < trs[i].children.length; j++)< obj.push(< name_column_field: matrix[0][j], value: matrix[i][j], name_row_field: matrix[i][0] >) > > // turn the object into JSON const completedJson = JSON.stringify(obj)
But if you wanted to do it all in one for loop, you could do this:
const trs = document.getElementsByTagName("tr") const obj= [] for (let i = 1; i < trs.length; i++)< for (let j = 1; j < trs[i].children.length; j++)< obj.push(< name_column_field: trs[0].children[j].textContent, value: trs[i].children[j].textContent, name_row_field: trs[i].children[0].textContent >) > > const completedJson = JSON.stringify(obj) console.log(completedJson)
Превратить array на c# в object json
В заголовке: «Превратить array на c# в object json».
В сообщении: «То получится массив с квадратными скобками, а мне это не нужно».
Из массива в C# естественно получается массив в json. Если вам не нужен массив, то не создавайте его. Элементарно, Ватсон!
На заметку: List — считай, тот же массив.
Вам бы для начала выучить, что такое JSON.
Тот огрызок данных, что вы поместили в начале, не является json — он не валидный.
Но вообще, там просматривается следующая структура: объект, имеющий свойство estimated_value , которое само является объектом с двумя свойствами: amount , currency .
Заметьте: объекты и свойства! Никаких массивов.
Ну и создавайте объекты со свойствами. Можно анонимные объекты.
decimal price = 123.3M; string letterCurrency = "EUR"; var obj = new < estimated_value = new < amount = price, currency = letterCurrency >>; string postData = JsonConvert.SerializeObject(obj); Console.WriteLine(postData);
И ещё напутствие: вы пишете на C# — языке со статической типизацией (хотя и динамическая в нём присутствует). В нём принято явно описывать используемые структуры данных. Поэтому создайте неоходимый класс (или классы). Кода для их описания нужно совсем немного. Всяко меньше, чем вы понаписали с Dictionary . А далее IDE будет вам выдавать удобные подсказки при использовании этих классов.
Использование JSON для матриц в SQL Server

Начиная с SQL Server 2017, использование массивов JSON для представления и обработки матрицы становится более практичным. SQL Server может читать их и обновлять значения в них, но не может их создавать. Для этого вам нужно создать JSON в виде строки. Большим их преимуществом является то, что вы можете передавать их между процедурами и функциями так же легко, как и любые другие строки, и быстро превращать их в таблицы.
Для разработчика SQL Server, матрицы, вероятно, наиболее полезны для решения более сложных задач поиска строк с использованием динамического программирования. Как только вы освоите этот тип техники, ряд, казалось бы, неразрешимых проблем значительно уменьшится. Есть около пятидесяти общих проблем со структурой данных, которые можно решить с помощью динамического программирования. До SQL Server 2017 это было трудно сделать в SQL из-за отсутствия поддержки этого стиля программирования. Запоминание, один из принципов этой техники, легко реализовать в SQL, но очень сложно преобразовать существующие процедурные алгоритмы для использования табличных переменных. Обычно проще и быстрее использовать строки в качестве псевдопеременных, как мы это делали с Edit Distance и алгоритмом Левенштейна, самой длинной общей подпоследовательностью и самой длинной общей подстрокой. Проблема с этим заключается в том, что код для извлечения значений массива может быть очень трудно расшифровать или отладить. JSON может сделать это очень легко с помощью ссылок на массивы путей.
Можно ли будет использовать массивы JSON для решения одной из этих проблем? Если так, намного ли это медленнее? Мы подумали, что было бы интересно преобразовать проблему самой низкой общей подпоследовательности в форму, основанную на json, и выполнить несколько тестов подряд. Для тех, кто имел привычку TLDR, был сделан вывод, что для его запуска требуется в два-три раза больше времени, но получается код, который легче писать, понимать и отлаживать. Мы подозреваем, что есть способы и средства сделать это быстрее.
IF Object_Id(N’LCS’) IS NOT NULL DROP FUNCTION LCS;
CREATE FUNCTION LCS
The longest common subsequence (LCS) problem is the problem of finding the
longest subsequence common to all sequences in two sequences. It differs
from problems of finding common substrings: unlike substrings, subsequences
are not required to occupy consecutive positions within the original
sequences. For example, the sequences «1234» and «1224533324» have an LCS
Author: Phil Factor
date: 05 April 2019
Select dbo.lcs (‘1234’, ‘1224533324’)
Select dbo.lcs (‘thisisatest’, ‘testing123testing’)
Select dbo.lcs ( ‘XMJYAUZ’, ‘MZJAWXU’)
Select dbo.lcs ( ‘beginning-middle-ending’,
the longest common subsequence as a string
(@xString VARCHAR(MAX), @yString VARCHAR(MAX))
DECLARE @ii INT = 1; —inner index
DECLARE @jj INT = 1; —next loop index
DECLARE @West INT; —array reference number to left
DECLARE @NorthWest INT; —array reference previous left
DECLARE @North INT; —array reference previous
DECLARE @Max INT; —holds the maximum of two values
DECLARE @Current INT; —current number of matches
DECLARE @Matrix NVARCHAR(MAX);
DECLARE @PreviousRow NVARCHAR(2000); — the previous matrix row
DECLARE @JSON NVARCHAR(4000); —json work variable
DECLARE @Numbers TABLE (jj INT);
— SQL Prompt formatting off
INSERT INTO @numbers(jj) —this is designed for words of max 40 characters
— SQL Prompt formatting on
—the to start with, the first row is all zeros.
N'[‘ + Replicate(‘0,’, Len(@xString) + 1) + N'»‘
+ Substring(@yString, 1, 1) + N'»]’;
SELECT @Matrix = @PreviousRow;—add this to the matrix
/* we now build the matrix in bottom up fashion. */
SELECT @West = 0, @JSON = NULL;
—now create a row in just one query
Json_Value(@PreviousRow, ‘$[‘ + Cast(jj — 1 AS VARCHAR(5)) + ‘]’),
Json_Value(@PreviousRow, ‘$[‘ + Cast(jj AS VARCHAR(5)) + ‘]’),
@Max = CASE WHEN @West > @North THEN @West ELSE @North END,
CASE WHEN Substring(@xString, jj, 1) = Substring(@yString, @ii, 1) THEN
@NorthWest + 1 ELSE @Max END,
+ Coalesce(Cast(@Current AS VARCHAR(5)), ‘null’), @West = @Current
FROM @Numbers AS f
—and store the result as the previous row
@JSON + N’,»‘ + Substring(@yString, @ii, 1) + N'»]’;
—and add the reow to the matrix
SELECT @Matrix = Coalesce(@Matrix + ‘,
‘, ») + @PreviousRow, @ii = @ii + 1;
—we add the boundong brackets.
SELECT @Matrix = N'[‘ + @Matrix + N’]’;
SELECT @ii = Len(@yString), @jj = Len(@xString);
DECLARE @previousColScore INT, @PreviousRowScore INT, @Ychar NCHAR;
DECLARE @Subsequence NVARCHAR(4000) = »;
WHILE (@Current > 0)
SELECT @Ychar = Substring(@yString, @ii, 1);
IF (@Ychar = Substring(@xString, @jj, 1))
— If current character in X[] and Y[] are same, then it is part of LCS
SELECT @ii = @ii — 1, @jj = @jj — 1,
@Subsequence = @Ychar + @Subsequence, @Current = @Current — 1;
—If not same, then find the larger of two and traverse in that direction
—find out the two scores, one to the north and one to the west
‘strict $[‘ + Convert(VARCHAR(5), @ii — 1) + ‘][‘
‘strict $[‘ + Convert(VARCHAR(5), @ii) + ‘][‘
+ Convert(VARCHAR(5), @jj — 1) + ‘]’
—either go north or west
ELSE SELECT @ii = @ii — 1;
— Now we do a quick test and timing with the old version
DECLARE @timing DATETIME;
SELECT @timing = GetDate();
IF dbo.LongestCommonSubsequence(‘1234’, ‘1224533324’) <> ‘1234’
RAISERROR(‘test 1 failed’, 16, 1);
IF dbo.LongestCommonSubsequence(‘thisisatest’, ‘testing123testing’) <> ‘tsitest’
RAISERROR(‘test 2 failed’, 16, 1);
IF dbo.LongestCommonSubsequence(‘Patient’, ‘Complaint’) <> ‘Paint’
RAISERROR(‘test 3 failed’, 16, 1);
IF dbo.LongestCommonSubsequence(‘XMJYAUZ’, ‘MZJAWXU’) <> ‘MJAU’
RAISERROR(‘test 4 failed’, 16, 1);
IF dbo.LongestCommonSubsequence(‘yab’, ‘xabyrbyab’) <> ‘yab’ RAISERROR(
‘test 5 failed’, 16, 1
RAISERROR(‘test 6 failed’, 16, 1);
SELECT DateDiff(MILLISECOND, @timing, GetDate()) AS [ms FOR traditional way];
—now do the same test run with the current function
SELECT @timing = GetDate();
IF dbo.LCS(‘1234’, ‘1224533324’) <> ‘1234’ RAISERROR(‘test 1 failed’, 16, 1);
IF dbo.LCS(‘thisisatest’, ‘testing123testing’) <> ‘tsitest’ RAISERROR(
‘test 2 failed’, 16, 1
IF dbo.LCS(‘Patient’, ‘Complaint’) <> ‘Paint’
RAISERROR(‘test 3 failed’, 16, 1);
IF dbo.LCS(‘XMJYAUZ’, ‘MZJAWXU’) <> ‘MJAU’ RAISERROR(‘test 4 failed’, 16, 1);
IF dbo.LCS(‘yab’, ‘xabyrbyab’) <> ‘yab’ RAISERROR(‘test 5 failed’, 16, 1);
IF dbo.LCS(‘beginning-middle-ending’, ‘beginning-diddle-dum-ending’) <> ‘beginning-iddle-ending’
RAISERROR(‘test 6 failed’, 16, 1);
SELECT DateDiff(MILLISECOND, @timing, GetDate()) AS [ms FOR JSON-based] ;
Матрица преобразований
Матрица преобразований предназначена для вычисления новых координат элемента с целью его трансформации и позволяет установить множество преобразований одновременно. Различают двумерную и трёхмерную матрицу, они отличаются друг от друга размером и пространством, на которое ориентированы. Поскольку двумерная матрица по размеру меньше и поэтому проще, на её примере рассмотрим общий принцип работы матриц.
Двумерная матрица
Преобразование с помощью двумерной матрицы происходит в плоскости экрана, при этом соблюдается условие, что линии всегда остаются параллельными, поэтому в качестве трансформации допустимы поворот, масштабирование, наклон и изменение положения, но никак не перспектива или нечто подобное. Это уже область работы трёхмерной матрицы. На рис. 1 показаны допустимые и невозможные преобразования, выполненные с помощью двумерных матриц.
| Исходный элемент | Поворот | Наклон | А вот так сделать нельзя |
Рис. 1. Трансформация элемента
Сама матрица имеет размер 3х3 и в общем виде записывается так:
Иногда для простоты третью строку опускают, поскольку она не оказывает влияния на конечный результат. Новые координаты каждой точки элемента получаются путём умножения матрицы преобразований на матрицу координат.

И вычисляются по следующей формуле:
Роль каждого коэффициента матрицы представлена в табл. 1.
| Коэффициент | Преобразование | Описание |
|---|---|---|
| a | Изменение масштаба по горизонтали. Значение больше 1 расширяет элемент, меньше 1, наоборот, сжимает. | |
| b | Наклон по вертикали. Положительное значение наклоняет вверх, отрицательное вниз. | |
| c | Наклон по горизонтали. Положительное значение наклоняет влево, отрицательное вправо. | |
| d | Изменение масштаба по вертикали. Значение больше 1 расширяет элемент, меньше 1 — сжимает. | |
| tx | Смещение по горизонтали в пикселях. Положительное значение сдвигает элемент вправо на заданное число пикселей, отрицательное значение сдвигает влево. | |
| ty | Смещение по вертикали в пикселях. При положительном значении элемент опускается на заданное число пикселей вниз или вверх при отрицательном значении. |
Для матрицы преобразований применяется функция matrix() , внутри скобок перечисляются коэффициенты.
transform: matrix(a, b, c, d, tx, ty)
Единичная матрица
Если в матрице коэффициенты a и d равны 1, а остальные элементы матрицы нулевые, то такая матрица называется единичной. Эта матрица применяется по умолчанию, поскольку не приводит к какой-либо трансформации элемента. Так что если необходимо произвести только один вид преобразований, единичную матрицу надо брать в качестве основы.
Масштаб по горизонтали
Чтобы увеличить размер элемента, допустим, в два раза по горизонтали, коэффициент a следует установить равным 2, а остальные коэффициенты оставить как в единичной матрице.
Считаем новые координаты:
x’ = 2*x + 0*y + 0
y’ = 0*x + 1*y + 0
Код для масштабирования показан в примере 1.
Пример 1. Масштабирование
Результат данного примера показан на рис. 2. Блок с текстом растягивается на 20% по горизонтали.

Рис. 2. Изменение масштаба текста
Отражение
Для отражение элемента по горизонтали следует установить a=-1, по вертикали d=-1 или оба значения одновременно для отражения одним разом по горизонтали и вертикали.
В примере 2 показано отражение текста по вертикали.
Пример 2. Отражение
Результат данного примера показан на рис. 3.

Рис. 3. Отражение текста по вертикали
Наклон
За наклон отвечают коэффициенты b и c, которые и влияют на вид элемента. Давайте установим c=1 и посмотрим, какие преобразования получатся.
x’ = 1*x + 1*y + 0
y’ = 0*x + 1*y + 0
Таким образом, меняется только координата x, которая увеличивается на значение y, что и приводит к наклону элемента. В примере 3 используется отрицательное значение коэффициента c для наклона вправо.
Пример 3. Наклон
Результат данного примера показан на рис. 4.

Рис. 4. Наклон блока
Поворот
Поворот является комбинацией масштабирования и наклона, но чтобы сохранить исходные пропорции элемента преобразования должны подчиняться строгим вычислениям с использование синусов и косинусов.

Сам поворот происходит по часовой стрелке, α задаёт угол поворота в градусах.
Перемещение
За сдвиг элемента по горизонтали отвечает коэффициент tx, а по вертикали ty. Значением выступает число пикселей.
Трёхмерная матрица
Трёхмерная матрица имеет размер 4х4 и применяется для преобразования координат элемента в трёхмерном пространстве. В общем виде она выглядит так:

Название «трёхмерная» лишь отражает тот факт, что матрица предназначена для работы в 3d-пространстве. Двумерная матрица является её частным случаем и для размера 4х4 имеет следующий вид:

В чистом виде эта матрица применяется редко из-за своей сложности и наличия удобных функций для трансформации в пространстве. Если вам интересна тригонометрия и формулы преобразований одних координат в другие, то почитайте этот материал.