aux-comparator
TypeScript icon, indicating that this package has built-in type declarations

4.0.3 • Public • Published

 Компаратор списков с простой логикой

Для поиска разницы по оригинальному числовому ключу в массивах структу.

Класс принимает 2 массива с одинаковой структурой. Старый (правый) и новый (Левый).

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

  • Comparator::setNewArray - установить массив с новыми данными
  • Comparator::setOldArray - установить правый со старыми данными
  • Comparator::setIndex - установить поле с уникальным ключём
  • Comparator::setIndexs - установить массив полей как уникальный ключь
  • Comparator::setCompareFunction - Устанавливает функцию для определения что должно быть отредактированно, а что должно быть проигнорировано
  • Comparator::sortNewArray - Отсортировать по ключу левый массив
  • Comparator::sortOldArray - Отсортировать по ключу правый массив
  • Comparator::softCompare - Мягкое сравнение
  • Comparator::hardCompare - Жёсткое сравнение
  • Comparator::afterComare - обработка результата сравнения

Описание структуры обработанных данных

  • ResultCompare::empty - Массив одинаковых значений T (Рекомендуется игнорировать)
  • ResultCompare::delete - Массив правых элементов T для удаления
  • ResultCompare::update - Массив элементов типа DiffResult для коррекции из левого массива
  • ResultCompare::add - Массив элементов T на добавление из левого массива

Описание структуры DiffResult

  • DiffResult::new - Новый элемент
  • DiffResult::old - Старый элемент

Принцип работы

hardCompare

Решение в лоб. Перебор массива в другом массиве.

Низкопроизводительный метод.

softCompare

Берёт два отсортированных массива и синхронно прокручивает левый и правый массив. Если индекс не совпадает, проверяет в чью сторону перекос и добавляет индекс наименьшему формируя команды удаления и создания элементов. Если индекс совпадает вызывается метод сравнения для определения куда отнести элементы массива - в редактирование или игнорирование

Когда заканчивается один из списков все элементы оставшиеся в противоположном массиве автоматически добавляюбтся в список на удаление или добавление автоматически.

Использование

Генератор случайных структур

interface Item {
    id: string;
    price: number;
    qnt: number;
}
 
let arrLeft = [];
let arrRight = [];

for(let i = 4000000; i > 0; i--) {
    if(Math.random() > 0.1) {
        arrLeft.push({
            id: i+"-ml",
            price: Math.round(1000 * Math.random())/100,
            qnt: Math.round(10 * Math.random())
        })
    } 
    if(Math.random() > 0.1) {
        arrRight.push({
            id: i+"-ml",
            price: Math.round(1000 * Math.random())/100,
            qnt: Math.round(10 * Math.random())
        })
    }
}

Клиентский код

new Comparator<Item>()
    .setNewArray(arrLeft)
    .setOldArray(arrRight)
    .setIndex("id")
    .setCompareFunction((l,r) => {
        return l.price == r.price && l.qnt == r.qnt
    })
    .sortNewArray()
    .sortOldArray()
    .softCompare()
    .afterComare((r) => {
        console.log({
            name: "soft",
            add: r.add.length,
            empty: r.empty.length,
            delete: r.delete.length,
            update: r.update.length,
            left: arrLeft.length,
            right: arrRight.length
        });
    })

Readme

Keywords

Package Sidebar

Install

npm i aux-comparator

Weekly Downloads

0

Version

4.0.3

License

ISC

Unpacked Size

36.2 kB

Total Files

12

Last publish

Collaborators

  • pikada-lab