Выровняйте массив объектов и объедините с последними - PullRequest
0 голосов
/ 03 марта 2020

У меня есть оригинальный массив, который мне нужно объединить со вторым обновленным массивом и записать выполненные действия.

для упрощения у меня есть эта последовательность. последовательность в массиве всегда упорядочена по свойству 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 до или после склеенных элементов, не имеет значения, но должно появляться вместе.

Также обратите внимание, что другие элементы в массиве не изменились, т.е. не были вставлены или удалены из последовательности.

...