Недавно я работал над своего рода задачей кодирования, целью которой было создать сетку определенного размера и построить три полезные функции вне сетки. Конечно, есть несколько способов решить эту проблему в целом, но я хотел поделиться своей методологией и решением (пусть это и не самый эффективный способ).

В конечном итоге нам нужно создать массив массивов, а затем заполнить каждый подмассив объектами. При создании сетки передаются два аргумента:
1) rows — количество строк (каждая строка является массивом)
2) cols — количество столбцов (каждый столбец состоит из объектов)

Вот такая структура данных у нас должна получиться:

Итак, мы создадим это с помощью класса JavaScript с именем Matrix и инициируем сетку внутри функции-конструктора. Мы инициируем свойство с именем grid, которое является массивом контейнеров для всей сетки.

Затем мы создадим два цикла for:

1) Цикл for для создания пустого массива для каждой строки
2) Вложенный цикл for для заполнения элементов строк пустыми объектами

Итак, теперь, если мы выполним следующие строки кода, мы получим сетку 4x4, показанную выше:

let newGrid = new Matrix(4,4);
console.log(newGrid)

Первая функция,getOne, которую мы создадим, будет принимать строку и столбец в качестве аргументов и возвращать значение в этом месте. Это очень просто:
getOne(row, col) {
return this.grid[row][col]
}

Вторая функция,update, должна позволять нам обновлять данную строку и столбец новыми данными. Сейчас наши отдельные элементы являются пустыми объектами. Итак, все, что нам нужно сделать, это получить доступ к строке и столбцу и установить свойство val равным переданным данным:

update(row, col, data) {
this.grid[row][col].val = data;
}

Третья и последняя функция,selectOldest, должна дать нам расположение самого старого элемента (строки и столбца). Чтобы определить, является ли один элемент старше другого, мы должны установить свойство даты для объекта при его первом создании и отметку времени при создании. Итак, сначала нам нужно изменить наш конструктор, включив date в качестве ключа и new Date() в качестве значения:

Теперь, когда наша сетка будет создана, все объекты будут иметь дату, связанную с ней. Итак, в нашей функции selectOldest() нам нужно перебрать каждый элемент сетки и сравнить даты. Таким образом, мы можем использовать вложенные циклы for для доступа к каждому элементу, а затем интегрировать условие if, чтобы проверить, был ли один объект создан до текущего самого старого объекта. А затем верните числа для фактической строки и столбца самого старого:

Мы также должны помнить об обновлении нашей функции update(), чтобы обновлять свойство даты после обновления.

update(row, col, data) {
this.grid[row][col].val = data;
this.grid[row][col].date = new Date()
}

Чтобы проверить нашу работу, мы можем вызвать функцию обновления и функцию selectOldest, чтобы убедиться, что она работает правильно.

let newGrid = new Matrix(4,4);
newGrid.update(2, 2, 3);
console.log(newGrid.grid);
console.log(newGrid.selectOldest());

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

Теперь у нас есть рабочая матричная структура данных. Конечно, есть крайние случаи, которые необходимо учитывать, но основная часть структуры уже сделана.

Вот и все!

https://www.dougschallmoser.com/