From 66397c17351120c1b20c103215748ae98659464d Mon Sep 17 00:00:00 2001 From: Brian Andress Date: Tue, 11 Jan 2022 13:07:36 -0600 Subject: [PATCH 1/2] add support for treating NaN values as equivalent --- index.ts | 5 ++++ tests/nan.js | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tests/nan.js diff --git a/index.ts b/index.ts index f4feb2f..5dfbf91 100644 --- a/index.ts +++ b/index.ts @@ -55,6 +55,11 @@ export default function diff( ); } else if ( objKey !== newObjKey && + !( + // treat NaN values as equivalent + typeof objKey === "number" && isNaN(objKey) && + typeof newObjKey === "number" && isNaN(newObjKey) + ) && !( areObjects && (isNaN(objKey) diff --git a/tests/nan.js b/tests/nan.js new file mode 100644 index 0000000..92b73fd --- /dev/null +++ b/tests/nan.js @@ -0,0 +1,68 @@ +import { test } from "uvu"; +import * as assert from "uvu/assert"; +import diff from "../dist/index.js"; + +test("new NaN value in object", () => { + assert.equal(diff({}, { testNaN: NaN }), [ + { + type: "CREATE", + path: ["testNaN"], + value: NaN, + }, + ]); +}); +test("change NaN value in object", () => { + assert.equal(diff({ testNaN: NaN }, { testNaN: 0 }), [ + { + type: "CHANGE", + path: ["testNaN"], + value: 0, + oldValue: NaN, + }, + ]); +}); +test("do not change NaN value in object", () => { + assert.equal(diff({ testNaN: NaN }, { testNaN: NaN }), []); +}); +test("remove NaN value in object", () => { + assert.equal(diff({ testNaN: NaN }, {}), [ + { + type: "REMOVE", + path: ["testNaN"], + oldValue: NaN, + }, + ]); +}); +test("new NaN value in array", () => { + assert.equal(diff([], [ NaN ]), [ + { + type: "CREATE", + path: [0], + value: NaN, + }, + ]); +}); +test("change NaN value in object", () => { + assert.equal(diff([ NaN ], [ 0 ]), [ + { + type: "CHANGE", + path: [0], + value: 0, + oldValue: NaN, + }, + ]); +}); +test("do not change NaN value in array", () => { + assert.equal(diff([ NaN ], [ NaN ]), []); +}); +test("remove NaN value in array", () => { + assert.equal(diff([ NaN ], []), [ + { + type: "REMOVE", + path: [0], + oldValue: NaN, + }, + ]); +}); + +test.run(); From 004c0ce881e9e81868100dbb288767826fe28e12 Mon Sep 17 00:00:00 2001 From: Jacob Jackson Date: Tue, 19 Mar 2024 14:53:32 -0400 Subject: [PATCH 2/2] Simplify change check --- index.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/index.ts b/index.ts index 40c4e42..f15a8f5 100644 --- a/index.ts +++ b/index.ts @@ -74,10 +74,8 @@ export default function diff( objKey !== newObjKey && !( // treat NaN values as equivalent - typeof objKey === "number" && isNaN(objKey) && - typeof newObjKey === "number" && isNaN(newObjKey) - ) && - !( + Number.isNaN(objKey) && + tNumber.isNaN(newObjKey) && areCompatibleObjects && (isNaN(objKey) ? objKey + "" === newObjKey + ""