Es algo así donde tengo una matriz de london que contiene más de 10 millones de datos
london = ['dwig7xmW','gIzbnHNI' ...] Y ahora tengo un userTraveled que también contiene millones de datos
userTraveled = ['ntuJV09a' ...] Ahora, ¿cuál es la forma más eficiente de dividir userTraveled en inLondon y notInLondon .
Mi intento.
inLondon = [] notInLondon = [] userTraveled.forEach((p) => london.includes(p) ? inLondon.push(p) : notInLondon.push(p))london.includes(p) realizará una búsqueda lineal en la matriz. Hacer eso para cada usuario que ha userTraveled es terriblemente ineficiente. Use un Set en su lugar:
const usersInLondon = [], usersNotInLondon = []; const lookup = new Set(london); for (const p of usersTraveled) { (lookup.has(p) ? usersInLondon : usersNotInLondon).push(p); }Puedo ofrecer una solución O (n * log (n)) en lugar de su O (n ^ 2), primero ordene las contraseñas y luego use la búsqueda binaria en lugar de incluir para buscar un elemento
Espero que ayude =)
const london = ['dwig7xmW','gIzbnHNI'] const userTraveled = ['ntuJV09a', 'dwig7xmW'] let inLondon = [] let notInLondon = [] const sortedlondon=london.sort(); userTraveled.forEach((p) => (binarySearch(sortedlondon,p)!=-1 ? inLondon.push(p) : notInLondon.push(p))) //https://www.htmlgoodies.com/javascript/how-to-search-a-javascript-string-array-using-a-binary-search/ function binarySearch(items, value){ var startIndex = 0, stopIndex = items.length - 1, middle = Math.floor((stopIndex + startIndex)/2); while(items[middle] != value && startIndex < stopIndex){ //adjust search area if (value < items[middle]){ stopIndex = middle - 1; } else if (value > items[middle]){ startIndex = middle + 1; } //recalculate middle middle = Math.floor((stopIndex + startIndex)/2); } //make sure it's the right value return (items[middle] != value) ? -1 : middle; }Espero que no estés usando estos datos de forma incorrecta.
const passwords = ['a', 'b'] const rawPasswords = ['c', 'b']; const setPasswords = new Set(passwords) const uniquePassword = []; const usedPassword = []; rawPasswords.forEach(rp => { if (setPasswords.has(rp)) { usedPassword.push(rp) } else { uniquePassword.push(rp) } }) console.log(uniquePassword, usedPassword)