Il modo più efficace per tenere traccia della posizione dei valori in una lista

1
var list = ['a','b','c','d','e','f','g','h'];

Ogni volta che faccio una chiamata API e ottengo quell'elenco, mostrandolo qui come array JavaScript, vorrei sapere se qualcuno degli elementi è stato spostato rapidamente (definito come, per esempio, più di x posizioni) in entrambe le direzioni rispetto alle precedenti richieste n . Ogni richiesta ottengo un array con gli stessi elementi in un ordine diverso.

In altre parole, se guardo 100 campioni di dati presi ciascuno a 1 minuto di distanza e tutti gli elementi si muovono all'interno dei campioni a velocità diverse, vorrei rilevare se qualcuno si muove all'interno di un intervallo di dire -n a + n durante quel periodo di tempo (in questo caso il tempo è di 100 minuti).

    
posta Fo. 06.04.2017 - 20:40
fonte

1 risposta

1

Quindi, se ho capito bene, vuoi rilevarlo in elenco , tra,

risposta n. 1,

['a','b','c','d','e','f','g','h']

e risposta # n ,

['c','b','d','a','g','f','h','e']

o di 'a' o 'e' è un valore che è stato spostato di più? (entrambi si muovono di 3 posizioni)

Se è così, ciò che puoi fare è mantenere due mappe bidirezionali valore-indice, per cui, alla risposta # 1,

oldMap = { 'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7 }

e alla risposta # n ,

newMap = { 'a': 3, 'b': 1, 'c': 0, 'd': 2, 'e': 7, 'f': 5, 'g': 4, 'h': 6 }

Quindi, puoi procedere con qualcosa sulla falsariga di,

var maxMoveValue = null;
var sofar = -1;
for (var value in newMap) {
   var distance = Math.abs(newMap[value] - oldMap[value]);
   var fastMove = (distance > sofar) && (distance >= x);
   maxMoveValue = fastMove ? value : maxMoveValue;
   sofar = fastMove ? distance : sofar;
}

dove x è la soglia che hai menzionato nella domanda.

(Ho omesso le inizializzazioni delle mappe - dalla tua lista variabile - e anche l'aggiornamento di oldMap sovrascritto da newMap , modulo n risposte elaborate)

'Spero che questo aiuti.

    
risposta data 06.04.2017 - 21:19
fonte

Leggi altre domande sui tag