Sto lavorando per integrare un widget UI di elenchi riordinabili con una raccolta Meteor.js (MongoDB, in effetti):
{
order: ???, // what type to use here?
property1: ...,
...
propertyN: ...
}
Ogni documento nella raccolta ha un campo order . L'interfaccia utente ottiene la raccolta dal server, la ordina dal campo order e la visualizza in un elenco. Quando l'utente trascina un elemento in una nuova posizione nell'elenco, ottengo il oldIndex del documento e il newIndex relativo all'inizio dell'elenco (dove è stato rilasciato). Ora devo aggiornare il campo order e salvare i documenti interessati nella raccolta.
Quale dovrebbe essere la natura del campo order per ridurre al minimo il numero di aggiornamenti, ma non limitare il numero di volte in cui un documento può essere riordinato?
Una implementazione ingenua utilizza interi e imposta order del oggetto caduto alla media aritmetica dei documenti prima di un dopo. Naturalmente, questo verrà eseguito in limiti di precisione in virgola mobile (50 riordini in JavaScript se inizi con interi consecutivi).
Un'altra implementazione (suggerita anche in questa domanda cambierebbe il order di tutti i documenti intermedi tra oldIndex e newIndex del documento rilasciato, o tra l'inizio / la fine dell'elenco e l'articolo scartato (che coinvolge meno elementi). Ovviamente, questo è meno efficiente, in particolare per le liste più grandi.
Qualcosa di più intelligente? Usando una stringa o un oggetto di qualche tipo per il campo order ?