Алгоритм для сравнения двух массивов данных с выявлением новых, удаленных и измененных записей. Каждая запись идентифицируется уникальным ID и может содержать несколько полей с данными.
// Базовые типы значений в коллекции
type CollectionType = string | number | boolean | Date;
// Структура значения элемента коллекции
interface CollectionItemValue {
__val: CollectionType; // Само значение
__row: number; // Номер строки
__col: number; // Номер колонки
}
// Структура элемента коллекции
interface CollectionItem {
[key: string]: CollectionItemValue;
}
// Тип коллекции - массив элементов
type Collection = CollectionItem[];
Алгоритм реализован в виде класса StateComparator
, который инкапсулирует всю логику сравнения и предоставляет удобный интерфейс для работы с данными.
class StateComparator {
/**
* Создает экземпляр компаратора
* @param newValues - Новый массив данных
* @param oldValues - Старый массив данных
*/
constructor(newValues: DataArray, oldValues: DataArray)
/**
* Находит новые элементы, которых нет в старой коллекции
*/
public getNewItems(): CollectionItem[]
/**
* Находит удаленные элементы, которых нет в новой коллекции
*/
public getOldItems(): CollectionItem[]
/**
* Находит измененные элементы и их различия
*/
public getChangedItems(): ModifiedItem[]
}
// Входные данные
const newValues = [
['id', 'param', 'status', 'mark'],
['Заказ 4', 1, 'done', 'mark'],
['Заказ 2', 1, 'in proc', 'mark'],
['Заказ 3', 1, 'in proc', 'mark'],
];
const oldValues = [
['id', 'param', 'status', 'mark'],
['Заказ 1', 1, 'done', 'mark'],
['Заказ 2', 2, 'done', 'mark'],
['Заказ 3', 1, 'done', 'mark'],
];
// Создание компаратора
const comparator = new StateComparator(newValues, oldValues);
// Получение результатов
const newItems = comparator.getNewItems();
const oldItems = comparator.getOldItems();
const changedItems = comparator.getChangedItems();
console.log('Новые записи:', newItems);
console.log('Удаленные записи:', oldItems);
console.log('Измененные записи:', changedItems);
Алгоритм возвращает три набора данных:
newItems
: Новые записи (только в новом массиве)
CollectionItem[]
oldItems
: Удаленные записи (только в старом массиве)
CollectionItem[]
changedItems
: Измененные записи
{
__modified: {
__status: boolean;
[key: string]: { new: CollectionType; old: CollectionType } | boolean;
};
id: string;
new: CollectionItem;
old: CollectionItem;
}[]
id
при сравнении измененийВременная сложность алгоритма:
Пространственная сложность: O(n), где n - общее количество элементов
Для входных данных из примера выше, результат будет следующим:
// Новые записи
[
{
"id": { "__val": "Заказ 4", "__row": 2, "__col": 1 },
"param": { "__val": 1, "__row": 2, "__col": 2 },
"status": { "__val": "done", "__row": 2, "__col": 3 },
"mark": { "__val": "mark", "__row": 2, "__col": 4 }
}
]
// Удаленные записи
[
{
"id": { "__val": "Заказ 1", "__row": 2, "__col": 1 },
"param": { "__val": 1, "__row": 2, "__col": 2 },
"status": { "__val": "done", "__row": 2, "__col": 3 },
"mark": { "__val": "mark", "__row": 2, "__col": 4 }
}
]
// Измененные записи
[
{
"__modified": {
"__status": true,
"param": { "new": 1, "old": 2 },
"status": { "new": "in proc", "old": "done" }
},
"id": "Заказ 2",
"new": {
"id": { "__val": "Заказ 2", "__row": 3, "__col": 1 },
"param": { "__val": 1, "__row": 3, "__col": 2 },
"status": { "__val": "in proc", "__row": 3, "__col": 3 },
"mark": { "__val": "mark", "__row": 3, "__col": 4 }
},
"old": {
"id": { "__val": "Заказ 2", "__row": 3, "__col": 1 },
"param": { "__val": 2, "__row": 3, "__col": 2 },
"status": { "__val": "done", "__row": 3, "__col": 3 },
"mark": { "__val": "mark", "__row": 3, "__col": 4 }
}
}
]