Estoy tratando de crear un comparador de matriz simple que indique las diferencias entre dos matrices diferentes. Me las he arreglado para conseguir esto, y en su mayoría funciona. Sin embargo, mi problema es que compara todas las diferencias específicas en la matriz, y debido a que está destinado a comparar dos tipos de matrices iguales, pero una es solo una versión actualizada, hay un problema con el conteo. Digamos que tenemos el elemento 1 y el elemento 2. Si el elemento 1 no es igual al elemento 2, como estamos comparando solo una versión actualizada de la matriz y una versión anterior, todos los demás elementos aún están en esa lista. Debido a esto, si comparamos los datos de todos los elementos después de la diferencia entre el elemento 1 y el elemento 2, entonces todos nuestros valores actualizados deberían ser x más altos dependiendo de cuántas diferencias haya antes de esos elementos. Debido a esto, después de la primera diferencia, cada valor individual es diferente, incluso si ya estaba en la versión anterior de la matriz. Esto describe con precisión mi problema. La primera diferencia viene en 1 y 2, sin embargo, debido a esta diferencia, todos los demás valores aumentan: 0|0 1|2 2|3 3|4 4|5 5|6 Las matrices reales serían algo así: ['Auto','Sniper','Citadel','Tank']['Auto','Gunner','Sniper','Citadel','Tank'] Como puede ver debido a la adición de Gunner, todos los otros valores de argumento que vienen después de Gunner se mueven hacia arriba. Pero debido a esto, cada valor único después de Gunner ahora también es diferente de su contraparte original, lo que significa que en lo que tenía originalmente, registraría todo después.
async function c() { const fetchO = await fetch('https://a/data'); const fetchN = await fetch('https://a/data'); const O = await fetchO.json(); const N = await fetchN.json(); for(let count in N || O) { if(N[count] !== O[count]) { console.table('Old: ', O[count], 'New: ', N[count]); } } } c();
He estado tratando de usar una variable de conteo mediocre como control para que no ocurra este error. Como esto.
let countControl=0; async function c() { const fetchO = await fetch('https://a/data'); const fetchN = await fetch('https://a/data'); const O = await fetchO.json(); const N = await fetchN.json(); for(let count in N || O) { if(N[count] !== O[count+countControl]) { console.table('Old: ', O[count+countControl], 'New: ', N[count]); if(O.length>N.length){countControl=countControl-1;} if(O.length<N.length){countControl=countControl+1;} } } } c();
El problema con esto es que count no es en realidad una variable definida, por lo que cuando hago [count+countControl], aparece como indefinido, pero si convierto count en una variable definida, tendré que hacer una función de actualización. en él, que no funcionará en esta situación. ¿Cómo puedo agregar un monitor de conteo que funcione? ¿O hay alguna manera diferente de hacer esto?
Si sigo su pregunta correctamente, desea contar las diferencias entre las dos matrices. Si podemos suponer que los elementos de cada matriz son únicos (es decir, no hay duplicados) y que el orden no importa, se convierte en un problema muy sencillo de resolver. Esto sería el equivalente a la operación de conjunto "diferencia simétrica" que da el conjunto de elementos solo en uno de dos conjuntos dados. A partir de ahí, solo es cuestión de contar los elementos que componen la diferencia simétrica. Esto se puede implementar de la siguiente manera.
const a = ['Auto','Sniper','Citadel','Tank']; const b = ['Auto','Gunner','Sniper','Citadel','Tank']; const symmetricDifference = (a, b) => { const difference = new Set(a); for (const element of new Set(b)) { if (difference.has(element)) { difference.delete(element); } else { difference.add(element); } } return Array.from(difference); }; const difference = symmetricDifference(a, b); const differenceCount = difference.length; console.log({ difference, differenceCount });
(Esta implementación aún se ocupa de Arrays en lugar de Sets fuera de symmetricDifference()
. Dependiendo de otras restricciones y la cantidad de objetos involucrados, podría ser significativamente mejor para el rendimiento usar Sets fuera de symmetricDifference()
también).
Si la suposición de unicidad no se cumple, el algoritmo general anterior debe ser adaptable para tratar en su lugar con los recuentos de cada elemento único. Sin embargo, si la suposición de que el orden no importa no se sostiene, el problema se vuelve mucho más difícil en el caso general. Sin embargo, dependiendo de su caso específico, puede haber atajos.