У меня есть оригинальный массив, который мне нужно объединить со вторым обновленным массивом и записать выполненные действия.
для упрощения у меня есть эта последовательность. последовательность в массиве всегда упорядочена по свойству order
. однако это не всегда связано с позицией.
//length can vary
let initial = [
{pos: 'a', order: '1'},
{pos: 'c', order: '2'},
{pos: 'g', order: '3'},
{pos: 't', order: '4'},
{pos: 'q'},
{pos: 'r'},
{pos: 'c'},
{pos: 'g'},
{pos: 'p'},
{pos: 'c'},
{pos: 'g'},
{pos: 't'}]
//length can vary to initial sequence
let updated = [
{pos: 'a', order: '1'}
{pos: 'p', order: '2'},
{pos: 'm', order: '3'},
{pos: 'g', order: '4'},
{pos: 't', order: '5'}, // NB: order has changed for `pos: t`. however it's still ordered within array.
{pos: 'q'},
{pos: 'r'},
{pos: 'c'},
{pos: 'g'},
{pos: 'p'},
{pos: 'c'},
{pos: 't'}]
Мне нужно зафиксировать изменение, чтобы
let reconciled = [
{pos: 'a'},
{pos: 'c', action: 'removed', order: '2'}, // Order # is irrelevant for delete. array position matters.
{pos: 'p', action: 'insert', order: '2'},
{pos: 'm', action: 'insert' order: '3'},
{pos: 'g'},
{pos: 't'},
{pos: 'q'},
{pos: 'r'},
{pos: 'c'},
{pos: 'g'},
{pos: 'p'},
{pos: 'c'},
{pos: 'g': action: 'removed'},
{pos: 't'}]
// or
let reconciled = [
{pos: 'a', order: '1'},
{pos: 'p', action: 'insert', order: '2'},
{pos: 'm', action: 'insert' order: '3'},
{pos: 'c', action: 'removed', order: '2'}, // Order # is irrelevant for delete. array position matters.
{pos: 'g'}, // no action
{pos: 't'}, // no action
{pos: 'q'}, // no action
{pos: 'r'}, // no action
{pos: 'c'}, // no action
{pos: 'g'}, // no action
{pos: 'p'}, // no action
{pos: 'c'}, // no action
{pos: 'g': action: 'removed'},
{pos: 't'}] // no action performed here
Я пробовал с union
, intersection
, xor
, merge
, new Set()
, new Map()
et c et c. Однако решения, которые у меня есть, не учитывают дубликаты и удаляют дубликаты. например, в начальном массиве pos: 'c'
встречается с индексами 1
, 6
и 9
, каждый из которых уникален, поэтому в обновленном массиве он должен регистрироваться как pos: 'c'
как удаленный из индекса 1
, тогда как в индексе 8
и 11
(в обновленном массиве) остаются прежними.
Уведомление по индексу 1-3
в обновленном массиве фиксирует вставку и удаление. Потому что c
был удален, а p
и m
были добавлены в позицию. То есть, появляется ли c
до или после склеенных элементов, не имеет значения, но должно появляться вместе.
Также обратите внимание, что другие элементы в массиве не изменились, т.е. не были вставлены или удалены из последовательности.