Dato un semplice array di valori, ad es.
["Apple", "Orange", "Banana", "Strawberry"]
e un elenco di operazioni dall'insieme di [ insert
, delete
, sort
e replace
], ad es.
[
{cmd: "insert", index: 2, entries: ["Cherry", "Kiwi"]},
{cmd: "delete", indices: [3]},
{cmd: "sort", newOrder: [3,1,2,0,4]},
{cmd: "insert", index: 3, entries: ["Peach"]},
{cmd: "replace", index: 3, newEntry: "Raspberry"}
]
che dovrebbe risultare nell'array
["Banana", "Orange", "Cherry", "Raspberry", "Apple", "Strawberry"]
Come posso, con uno sforzo relativamente ridotto, trasformare la mia sequenza di operazioni in qualcosa di meno ridondante? Per es.
[
{cmd: "sort", newOrder: [2,1,0,3]},
{cmd: "insert", index: 2, entries: ["Cherry", "Raspberry"]}
]
Si noti che l'eliminazione di una voce e l'inserimento di una voce identica è considerata equivalente all'aggiunta di una voce completamente nuova, mentre l'inserimento di una nuova voce e la successiva eliminazione di annulli. È necessario tenere traccia delle modifiche / sostituzioni / ridenominazioni delle voci, ma non si combinano con nessuna delle altre operazioni.
Domanda:
Questo sembra qualcosa che si presenterebbe nel contesto dell'ottimizzazione delle query del database, ma non ho idea di cosa sia per google. Alla fine sto cercando un algoritmo (preferibilmente un'implementazione JS) che automatizza questo genere di cose per me, anche se solo in modo ingenuo / avido (non è necessario cercare esaustivamente la riduzione migliore, se non può essere fatto in tempo polinomiale).
Sfondo:
Questo è emerso mentre si lavorava su un'app Web in cui l'utente può modificare un elenco di voci, accettare e inviare tali modifiche e quindi attivare un rimpasto di un insieme di matrici corrispondenti sul server. Ciò significa che devo catturare il modo in cui gli elementi si muovono nell'array, non solo come appare l'array dopo aver apportato tutte le modifiche. (Ho bisogno di tenere traccia delle operazioni per la funzionalità di annullamento / ripristino comunque.) Poiché la quantità di dati coinvolti può essere piuttosto grande, combinando tali operazioni prima di inviarle si tradurrebbe in tempi di caricamento più brevi e meno scritture di database sul lato server. Tutto questo è puramente teorico a questo punto e potrebbe benissimo essere un'ottimizzazione prematura, ma ho trovato un problema interessante e mi piacerebbe un po 'di input.