Bug: Set compares by reference not value
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript
- Área
- tooling
Línea de trabajo
Empieza en index.js, en la comparación de Sets de ES6, y revisa test/node/tests.js, especialmente los casos extraEs6 para Sets y Maps anidados. Ejecuta yarn benchmark y las pruebas de corrección para reproducir las diferencias con lodash.isEqual. La tarea estará terminada cuando los casos de Sets anidados se comparen correctamente sin romper las pruebas genéricas, de ES6 y de React existentes.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Upstream fast-deep-equal can't handle equal(new Set(["1", {}]), new Set(["1", {}])) because it compares by reference setA.has(setBElement).
Note that when running the correctness tests during yarn benchmark we get differences with lodash.isEqual which is correct:
--- correctness tests: generic and react ---
react-fast-compare
fast-deep-equal
lodash.isEqual
- different result: lodash.isEqual objects objects with different `toString` functions returning same values are equal
- different result: lodash.isEqual Maps empty maps of different class are not equal
- different result: lodash.isEqual Maps not equal maps (same key "order" - instances of different classes)
- different result: lodash.isEqual Sets empty sets of different class are not equal
- different result: lodash.isEqual Sets not equal sets (same value "order" - instances of different classes)
- different result: lodash.isEqual Sets not equal sets (different instances of objects)
Here's a WIP diff against https://github.com/FormidableLabs/react-fast-compare/tree/experiment/es6 branch that could fix that:
diff --git a/index.js b/index.js
index 2f03bfb..6451b7b 100644
--- a/index.js
+++ b/index.js
@@ -56,11 +56,23 @@ function equal(a, b) {
return true;
}
+ // There's an upstream bug in `fast-deep-equal` for nested `Set`s
+ // which our tests do cover.
+ var bIt, bI;
if (hasSet && (a instanceof Set) && (b instanceof Set)) {
if (a.size !== b.size) return false;
it = a.entries();
- for (i = it.next(); !i.done; i = it.next())
- if (!b.has(i.value[0])) return false;
+ aSetLoop: for (i = it.next(); !i.done; i = it.next()) {
+ if (!b.has(i.value[0])) {
+ // NOTE: Modification to fix nested set issue in `fast-deep-equal`
+ // Add manual iteration of all set B values.
+ bIt = b.entries();
+ for (bI = bIt.next(); !bI.done; bI = bIt.next())
+ if (equal(i.value[0], bI.value[0])) continue aSetLoop;
+
+ return false;
+ }
+ }
return true;
}
// END: Modifications
diff --git a/test/node/tests.js b/test/node/tests.js
index 02336e5..3db4c74 100644
--- a/test/node/tests.js
+++ b/test/node/tests.js
@@ -64,9 +64,57 @@ const react = [
}
];
+const extraEs6 = [
+ {
+ description: 'Additional es6 tests',
+ reactSpecific: true,
+ tests: [
+ {
+ description: 'nested Maps with same values are equal',
+ value1: new Map([['one', 1], ['map', new Map([['two', 2]])]]),
+ value2: new Map([['one', 1], ['map', new Map([['two', 2]])]]),
+ equal: true
+ },
+ {
+ description: 'nested Maps with different values are not equal',
+ value1: new Map([['one', 1], ['map', new Map([['two', 2]])]]),
+ value2: new Map([['one', 1], ['map', new Map([['three', 3]])]]),
+ equal: false
+ },
+ // Fails in `fast-deep-equal`
+ {
+ description: 'nested Sets with same values are equal',
+ value1: new Set(['one', new Set(['two'])]),
+ value2: new Set(['one', new Set(['two'])]),
+ equal: true
+ },
+ {
+ description: 'nested Sets with different values are not equal',
+ value1: new Set(['one', new Set(['two'])]),
+ value2: new Set(['one', new Set(['three'])]),
+ equal: false
+ },
+ // Fails in `fast-deep-equal`
+ {
+ description: 'nested Maps + Sets with same values are equal',
+ value1: new Map([['one', 1], ['set', new Set(['one', new Set(['two'])])]]),
+ value2: new Map([['one', 1], ['set', new Set(['one', new Set(['two'])])]]),
+ equal: true
+ },
+ {
+ description: 'nested Maps + Sets with different values are not equal',
+ value1: new Map([['one', 1], ['set', new Set(['one', new Set(['two'])])]]),
+ value2: new Map([['one', 1], ['set', new Set(['one', new Set(['three'])])]]),
+ equal: false
+ }
+ ]
+ }
+];
+
module.exports = {
generic,
es6,
+ extraEs6,
react,
- all: [...generic, ...es6, ...react],
+ all: [...generic, ...es6, ...extraEs6, ...react],
};
Could look to open either upstream or in our project.
- Lenguaje dominante
- JavaScript
- Estrellas
- 1.7k
- Forks
- 54
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de FormidableLabs/react-fast-compare
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 45/100
-
unverified
Dificultad 3/5 1-2 días Aptitud para principiantes 32/100
FormidableLabs/react-fast-compare#129 · 1 comentario ·
-
Add ability to compare functionsPosiblemente ocupada @quantizor la tomó hace 1463 días. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
FormidableLabs/react-fast-compare#114 · 9 comentarios ·
-
Audit security alertsAbiertoinvestigate
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
FormidableLabs/react-fast-compare#70 · 2 comentarios ·
-
enhancement
Dificultad 5/5 Más de una semana Aptitud para principiantes 30/100
FormidableLabs/react-fast-compare#68 · 11 reacciones ·
Todos los issues de FormidableLabs/react-fast-compare
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 83/100
module-federation/core#5205 ·
Los mantenedores suelen responder en 1 día
-
affects:v0.5.2 area:frontend audit:ui-ux-2026-10 bug priority:P2
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
berntpopp/kidney-genetics-db#326 ·
Los mantenedores suelen responder en 1 día
-
task
Dificultad 1/5 Menos de una hora Aptitud para principiantes 83/100
TAMULib/fw-registry#550 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
-
NWCWalletService.subscribe: response is never published if the handler finishes after unsubscribe (regression in 8.1.0)Posiblemente ocupada @ajaysehwal la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100