From 24cda3d37de8219d57bcbdc526c28fc4fd9c9e5a Mon Sep 17 00:00:00 2001 From: KCSquid Date: Mon, 6 Jan 2025 16:03:51 -0500 Subject: [PATCH 1/7] add snippet to compare two javascript arrays for equality --- public/consolidated/javascript.json | 14 ++++++++++- .../array-manipulation/compare-arrays.md | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 snippets/javascript/array-manipulation/compare-arrays.md diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index 7087e0ec..f209c85e 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -2,6 +2,18 @@ { "name": "Array Manipulation", "snippets": [ + { + "title": "Compare Arrays", + "description": "Compares two arrays to check if they are equal.", + "author": "KCSquid", + "tags": [ + "array", + "compare", + "equal" + ], + "contributors": [], + "code": "const compareArrays = (array1, array2) => {\n if (array1.length !== array2.length) return false;\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n// Usage:\narray1 = [1, 2, 3, 4, 5];\narray2 = [5, 4, 3, 2, 1];\ncompareArrays(array1, array2); // Returns: false\n" + }, { "title": "Partition Array", "description": "Splits an array into two arrays based on a callback function.", @@ -410,7 +422,7 @@ "algebra" ], "contributors": [], - "code": "function combinations(n, r) {\n function factorial(x) {\n if (x === 0 || x === 1) return 1;\n let result = 1;\n for (let i = 2; i <= x; i++) {\n result *= i;\n }\n return result;\n }\n return factorial(n) / (factorial(r) * factorial(n - r));\n}\n\n// Usage:\ncombinations(12,24); // Returns: 7.720248753351544e-16\ncombinations(1,22); // Returns: 8.896791392450574e-22\n" + "code": "function combinations(n, r) {\n if (n < 0 || r < 0 || n < r) {\n throw new Error('Invalid input: n and r must be non-negative and n must be greater than or equal to r.');\n }\n\n function factorial(x) {\n if (x === 0 || x === 1) return 1;\n let result = 1;\n for (let i = 2; i <= x; i++) {\n result *= i;\n }\n return result;\n }\n\n const numerator = factorial(n);\n const denominator = factorial(r) * factorial(n - r);\n return numerator / denominator;\n}\n\n// Usage:\ncombinations(24,22); // Returns: 276\ncombinations(5,3); // Returns: 10\n" }, { "title": "Cross Product", diff --git a/snippets/javascript/array-manipulation/compare-arrays.md b/snippets/javascript/array-manipulation/compare-arrays.md new file mode 100644 index 00000000..81349dfb --- /dev/null +++ b/snippets/javascript/array-manipulation/compare-arrays.md @@ -0,0 +1,25 @@ +--- +title: Compare Arrays +description: Compares two arrays to check if they are equal. +author: KCSquid +tags: array,compare,equal +--- + +```js +const compareArrays = (array1, array2) => { + if (array1.length !== array2.length) return false; + + for (let i = 0; i < array1.length; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + + return true; +} + +// Usage: +array1 = [1, 2, 3, 4, 5]; +array2 = [5, 4, 3, 2, 1]; +compareArrays(array1, array2); // Returns: false +``` \ No newline at end of file From a06fbfb0f2573b9db4dc6d62f3cbdbcb5e95290e Mon Sep 17 00:00:00 2001 From: KCSquid Date: Tue, 7 Jan 2025 12:29:14 -0500 Subject: [PATCH 2/7] update compare-arrays to validate arrays and support nested arrays --- public/consolidated/javascript.json | 2 +- .../array-manipulation/compare-arrays.md | 28 ++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index f209c85e..5ca580e3 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -12,7 +12,7 @@ "equal" ], "contributors": [], - "code": "const compareArrays = (array1, array2) => {\n if (array1.length !== array2.length) return false;\n\n for (let i = 0; i < array1.length; i++) {\n if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n// Usage:\narray1 = [1, 2, 3, 4, 5];\narray2 = [5, 4, 3, 2, 1];\ncompareArrays(array1, array2); // Returns: false\n" + "code": "const compareArrays = (array1, array2) => {\n if (!Array.isArray(array1) || !Array.isArray(array2)) return false;\n if (array1.length !== array2.length) return false;\n\n const traverse = (arr1, arr2) => {\n for (let i = 0; i < arr1.length; i++) {\n if (Array.isArray(arr1[i]) && Array.isArray(arr2[i])) {\n if (!traverse(arr1[i], arr2[i])) return false;\n } else if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n return traverse(array1, array2);\n}\n\n// Usage:\nconst number = 123;\nconst array1 = [1, 2, 3, 4, 5];\nconst array2 = [1, 2, 3, 4, 5];\nconst array3 = [[1, 2], [3, 4]];\nconst array4 = [[1, 2], [3, 4]];\n\ncompareArrays(array1, array2); // Returns: true\ncompareArrays(array1, number); // Returns: false\ncompareArrays(array1, array4); // Returns: false\ncompareArrays(array3, array4); // Returns: true\n" }, { "title": "Partition Array", diff --git a/snippets/javascript/array-manipulation/compare-arrays.md b/snippets/javascript/array-manipulation/compare-arrays.md index 81349dfb..b7e33bdf 100644 --- a/snippets/javascript/array-manipulation/compare-arrays.md +++ b/snippets/javascript/array-manipulation/compare-arrays.md @@ -7,19 +7,33 @@ tags: array,compare,equal ```js const compareArrays = (array1, array2) => { + if (!Array.isArray(array1) || !Array.isArray(array2)) return false; if (array1.length !== array2.length) return false; - for (let i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; + const traverse = (arr1, arr2) => { + for (let i = 0; i < arr1.length; i++) { + if (Array.isArray(arr1[i]) && Array.isArray(arr2[i])) { + if (!traverse(arr1[i], arr2[i])) return false; + } else if (arr1[i] !== arr2[i]) { + return false; + } } + + return true; } - return true; + return traverse(array1, array2); } // Usage: -array1 = [1, 2, 3, 4, 5]; -array2 = [5, 4, 3, 2, 1]; -compareArrays(array1, array2); // Returns: false +const number = 123; +const array1 = [1, 2, 3, 4, 5]; +const array2 = [1, 2, 3, 4, 5]; +const array3 = [[1, 2], [3, 4]]; +const array4 = [[1, 2], [3, 4]]; + +compareArrays(array1, array2); // Returns: true +compareArrays(array1, number); // Returns: false +compareArrays(array1, array4); // Returns: false +compareArrays(array3, array4); // Returns: true ``` \ No newline at end of file From 472bbfb0ab7181ce965241f9b94395993fa9c4bd Mon Sep 17 00:00:00 2001 From: KCSquid Date: Tue, 7 Jan 2025 12:57:26 -0500 Subject: [PATCH 3/7] add support for object comparison in arrays (new function compareObjects), update usage --- public/consolidated/javascript.json | 2 +- .../array-manipulation/compare-arrays.md | 56 ++++++++++++++----- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index 5ca580e3..6fb2405a 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -12,7 +12,7 @@ "equal" ], "contributors": [], - "code": "const compareArrays = (array1, array2) => {\n if (!Array.isArray(array1) || !Array.isArray(array2)) return false;\n if (array1.length !== array2.length) return false;\n\n const traverse = (arr1, arr2) => {\n for (let i = 0; i < arr1.length; i++) {\n if (Array.isArray(arr1[i]) && Array.isArray(arr2[i])) {\n if (!traverse(arr1[i], arr2[i])) return false;\n } else if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n return traverse(array1, array2);\n}\n\n// Usage:\nconst number = 123;\nconst array1 = [1, 2, 3, 4, 5];\nconst array2 = [1, 2, 3, 4, 5];\nconst array3 = [[1, 2], [3, 4]];\nconst array4 = [[1, 2], [3, 4]];\n\ncompareArrays(array1, array2); // Returns: true\ncompareArrays(array1, number); // Returns: false\ncompareArrays(array1, array4); // Returns: false\ncompareArrays(array3, array4); // Returns: true\n" + "code": "const compareArrays = (array1, array2) => {\n if (\n !Array.isArray(array1) || !Array.isArray(array2) ||\n array1.length !== array2.length\n ) return false;\n\n for (let i = 0; i < array1.length; i++) {\n if (Array.isArray(array1[i]) && Array.isArray(array2[i])) {\n if (!compareArrays(array1[i], array2[i])) return false;\n } else if (typeof array1[i] === \"object\" && typeof array2[i] === \"object\") {\n if (!compareObjects(array1[i], array2[i])) return false;\n } else if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst compareObjects = (obj1, obj2) => {\n if (typeof obj1 !== \"object\" || typeof obj2 !== \"object\") return false;\n\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n\n for (let key of keys1) {\n const val1 = obj1[key];\n const val2 = obj2[key];\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (!compareArrays(val1, val2)) return false;\n } else if (typeof val1 === \"object\" && typeof val2 === \"object\") {\n if (!compareObjects(val1, val2)) return false;\n } else if (val1 !== val2) {\n return false;\n }\n }\n\n return true;\n};\n\n// Usage:\nconst number = 123;\nconst array1 = [1, 2, 3, 4, 5];\nconst array2 = [1, 2, 3, 4, 5];\nconst array3 = [[1, 2], [3, 4]];\nconst array4 = [[1, 2], [3, 4]];\nconst array5 = [{ a: 1, b: [{ c: 2 }] }, 3];\nconst array6 = [{ a: 1, b: [{ c: 2 }] }, 3];\n\ncompareArrays(array1, array2); // Returns: true\ncompareArrays(array3, array4); // Returns: true\ncompareArrays(array5, array6); // Returns: true\ncompareArrays(array1, number); // Returns: false\ncompareArrays(array3, array6); // Returns: false\n" }, { "title": "Partition Array", diff --git a/snippets/javascript/array-manipulation/compare-arrays.md b/snippets/javascript/array-manipulation/compare-arrays.md index b7e33bdf..2ddebff3 100644 --- a/snippets/javascript/array-manipulation/compare-arrays.md +++ b/snippets/javascript/array-manipulation/compare-arrays.md @@ -7,23 +7,46 @@ tags: array,compare,equal ```js const compareArrays = (array1, array2) => { - if (!Array.isArray(array1) || !Array.isArray(array2)) return false; - if (array1.length !== array2.length) return false; - - const traverse = (arr1, arr2) => { - for (let i = 0; i < arr1.length; i++) { - if (Array.isArray(arr1[i]) && Array.isArray(arr2[i])) { - if (!traverse(arr1[i], arr2[i])) return false; - } else if (arr1[i] !== arr2[i]) { - return false; - } + if ( + !Array.isArray(array1) || !Array.isArray(array2) || + array1.length !== array2.length + ) return false; + + for (let i = 0; i < array1.length; i++) { + if (Array.isArray(array1[i]) && Array.isArray(array2[i])) { + if (!compareArrays(array1[i], array2[i])) return false; + } else if (typeof array1[i] === "object" && typeof array2[i] === "object") { + if (!compareObjects(array1[i], array2[i])) return false; + } else if (array1[i] !== array2[i]) { + return false; } + } + + return true; +}; + +const compareObjects = (obj1, obj2) => { + if (typeof obj1 !== "object" || typeof obj2 !== "object") return false; + + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) return false; - return true; + for (let key of keys1) { + const val1 = obj1[key]; + const val2 = obj2[key]; + + if (Array.isArray(val1) && Array.isArray(val2)) { + if (!compareArrays(val1, val2)) return false; + } else if (typeof val1 === "object" && typeof val2 === "object") { + if (!compareObjects(val1, val2)) return false; + } else if (val1 !== val2) { + return false; + } } - return traverse(array1, array2); -} + return true; +}; // Usage: const number = 123; @@ -31,9 +54,12 @@ const array1 = [1, 2, 3, 4, 5]; const array2 = [1, 2, 3, 4, 5]; const array3 = [[1, 2], [3, 4]]; const array4 = [[1, 2], [3, 4]]; +const array5 = [{ a: 1, b: [{ c: 2 }] }, 3]; +const array6 = [{ a: 1, b: [{ c: 2 }] }, 3]; compareArrays(array1, array2); // Returns: true -compareArrays(array1, number); // Returns: false -compareArrays(array1, array4); // Returns: false compareArrays(array3, array4); // Returns: true +compareArrays(array5, array6); // Returns: true +compareArrays(array1, number); // Returns: false +compareArrays(array3, array6); // Returns: false ``` \ No newline at end of file From 6d4d53a2f7f644bc00a78130a9888fcf8e44dea1 Mon Sep 17 00:00:00 2001 From: KCSquid Date: Wed, 8 Jan 2025 10:31:29 -0500 Subject: [PATCH 4/7] make significantly shorter, use ternary operator for comparisons when possible, switch to strict equality, use every instead of loop for one liner, add object tag --- public/consolidated/javascript.json | 3 +- .../array-manipulation/compare-arrays.md | 71 +++++-------------- 2 files changed, 21 insertions(+), 53 deletions(-) diff --git a/public/consolidated/javascript.json b/public/consolidated/javascript.json index 6fb2405a..c5a9e898 100644 --- a/public/consolidated/javascript.json +++ b/public/consolidated/javascript.json @@ -8,11 +8,12 @@ "author": "KCSquid", "tags": [ "array", + "object", "compare", "equal" ], "contributors": [], - "code": "const compareArrays = (array1, array2) => {\n if (\n !Array.isArray(array1) || !Array.isArray(array2) ||\n array1.length !== array2.length\n ) return false;\n\n for (let i = 0; i < array1.length; i++) {\n if (Array.isArray(array1[i]) && Array.isArray(array2[i])) {\n if (!compareArrays(array1[i], array2[i])) return false;\n } else if (typeof array1[i] === \"object\" && typeof array2[i] === \"object\") {\n if (!compareObjects(array1[i], array2[i])) return false;\n } else if (array1[i] !== array2[i]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst compareObjects = (obj1, obj2) => {\n if (typeof obj1 !== \"object\" || typeof obj2 !== \"object\") return false;\n\n const keys1 = Object.keys(obj1);\n const keys2 = Object.keys(obj2);\n if (keys1.length !== keys2.length) return false;\n\n for (let key of keys1) {\n const val1 = obj1[key];\n const val2 = obj2[key];\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n if (!compareArrays(val1, val2)) return false;\n } else if (typeof val1 === \"object\" && typeof val2 === \"object\") {\n if (!compareObjects(val1, val2)) return false;\n } else if (val1 !== val2) {\n return false;\n }\n }\n\n return true;\n};\n\n// Usage:\nconst number = 123;\nconst array1 = [1, 2, 3, 4, 5];\nconst array2 = [1, 2, 3, 4, 5];\nconst array3 = [[1, 2], [3, 4]];\nconst array4 = [[1, 2], [3, 4]];\nconst array5 = [{ a: 1, b: [{ c: 2 }] }, 3];\nconst array6 = [{ a: 1, b: [{ c: 2 }] }, 3];\n\ncompareArrays(array1, array2); // Returns: true\ncompareArrays(array3, array4); // Returns: true\ncompareArrays(array5, array6); // Returns: true\ncompareArrays(array1, number); // Returns: false\ncompareArrays(array3, array6); // Returns: false\n" + "code": "const compareArrays = (a, b) => {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((v, i) => \n Array.isArray(v) && Array.isArray(b[i]) ? compareArrays(v, b[i]) :\n typeof v === \"object\" && typeof b[i] === \"object\" ? compareObjects(v, b[i]) :\n v === b[i]\n );\n};\n\nconst compareObjects = (a, b) => {\n if (typeof a !== \"object\" || typeof b !== \"object\" || Object.keys(a).length !== Object.keys(b).length) return false;\n return Object.keys(a).every(k => \n Array.isArray(a[k]) && Array.isArray(b[k]) ? compareArrays(a[k], b[k]) :\n typeof a[k] === \"object\" && typeof b[k] === \"object\" ? compareObjects(a[k], b[k]) :\n a[k] === b[k]\n );\n};\n\n// Usage:\ncompareArrays([1, 2, 3], [1, 2, 3]); // Returns: true\ncompareArrays([1, 2, 3], [3, 2, 1]); // Returns: false\ncompareArrays([{a:1}], [{a:1}]); // Returns: true\ncompareArrays([{a:1}], null); // Returns: false\n" }, { "title": "Partition Array", diff --git a/snippets/javascript/array-manipulation/compare-arrays.md b/snippets/javascript/array-manipulation/compare-arrays.md index 2ddebff3..655b8a63 100644 --- a/snippets/javascript/array-manipulation/compare-arrays.md +++ b/snippets/javascript/array-manipulation/compare-arrays.md @@ -2,64 +2,31 @@ title: Compare Arrays description: Compares two arrays to check if they are equal. author: KCSquid -tags: array,compare,equal +tags: array,object,compare,equal --- ```js -const compareArrays = (array1, array2) => { - if ( - !Array.isArray(array1) || !Array.isArray(array2) || - array1.length !== array2.length - ) return false; - - for (let i = 0; i < array1.length; i++) { - if (Array.isArray(array1[i]) && Array.isArray(array2[i])) { - if (!compareArrays(array1[i], array2[i])) return false; - } else if (typeof array1[i] === "object" && typeof array2[i] === "object") { - if (!compareObjects(array1[i], array2[i])) return false; - } else if (array1[i] !== array2[i]) { - return false; - } - } - - return true; +const compareArrays = (a, b) => { + if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false; + return a.every((v, i) => + Array.isArray(v) && Array.isArray(b[i]) ? compareArrays(v, b[i]) : + typeof v === "object" && typeof b[i] === "object" ? compareObjects(v, b[i]) : + v === b[i] + ); }; -const compareObjects = (obj1, obj2) => { - if (typeof obj1 !== "object" || typeof obj2 !== "object") return false; - - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - if (keys1.length !== keys2.length) return false; - - for (let key of keys1) { - const val1 = obj1[key]; - const val2 = obj2[key]; - - if (Array.isArray(val1) && Array.isArray(val2)) { - if (!compareArrays(val1, val2)) return false; - } else if (typeof val1 === "object" && typeof val2 === "object") { - if (!compareObjects(val1, val2)) return false; - } else if (val1 !== val2) { - return false; - } - } - - return true; +const compareObjects = (a, b) => { + if (typeof a !== "object" || typeof b !== "object" || Object.keys(a).length !== Object.keys(b).length) return false; + return Object.keys(a).every(k => + Array.isArray(a[k]) && Array.isArray(b[k]) ? compareArrays(a[k], b[k]) : + typeof a[k] === "object" && typeof b[k] === "object" ? compareObjects(a[k], b[k]) : + a[k] === b[k] + ); }; // Usage: -const number = 123; -const array1 = [1, 2, 3, 4, 5]; -const array2 = [1, 2, 3, 4, 5]; -const array3 = [[1, 2], [3, 4]]; -const array4 = [[1, 2], [3, 4]]; -const array5 = [{ a: 1, b: [{ c: 2 }] }, 3]; -const array6 = [{ a: 1, b: [{ c: 2 }] }, 3]; - -compareArrays(array1, array2); // Returns: true -compareArrays(array3, array4); // Returns: true -compareArrays(array5, array6); // Returns: true -compareArrays(array1, number); // Returns: false -compareArrays(array3, array6); // Returns: false +compareArrays([1, 2, 3], [1, 2, 3]); // Returns: true +compareArrays([1, 2, 3], [3, 2, 1]); // Returns: false +compareArrays([{a:1}], [{a:1}]); // Returns: true +compareArrays([{a:1}], null); // Returns: false ``` \ No newline at end of file From 0b414afbb62868f3f63a2142d1601857ae9d931d Mon Sep 17 00:00:00 2001 From: KCSquid Date: Thu, 9 Jan 2025 16:14:55 -0500 Subject: [PATCH 5/7] merge with current state of main --- quicksnip | 1 + 1 file changed, 1 insertion(+) create mode 160000 quicksnip diff --git a/quicksnip b/quicksnip new file mode 160000 index 00000000..93ccb167 --- /dev/null +++ b/quicksnip @@ -0,0 +1 @@ +Subproject commit 93ccb1675d32fdb832357912eac6980f06c78c2b From c73bd170cefccf50b9e05c83921f27fbf1873874 Mon Sep 17 00:00:00 2001 From: KCSquid Date: Thu, 9 Jan 2025 16:25:07 -0500 Subject: [PATCH 6/7] delete random quicksnip folder --- quicksnip | 1 - 1 file changed, 1 deletion(-) delete mode 160000 quicksnip diff --git a/quicksnip b/quicksnip deleted file mode 160000 index 93ccb167..00000000 --- a/quicksnip +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 93ccb1675d32fdb832357912eac6980f06c78c2b From 6d194641113517111241de7425d1d5303e7b52ed Mon Sep 17 00:00:00 2001 From: KCSquid Date: Fri, 10 Jan 2025 17:40:01 -0500 Subject: [PATCH 7/7] made description for compare-arrays more descriptive --- snippets/javascript/array-manipulation/compare-arrays.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/snippets/javascript/array-manipulation/compare-arrays.md b/snippets/javascript/array-manipulation/compare-arrays.md index 655b8a63..3215ee1d 100644 --- a/snippets/javascript/array-manipulation/compare-arrays.md +++ b/snippets/javascript/array-manipulation/compare-arrays.md @@ -1,6 +1,6 @@ --- title: Compare Arrays -description: Compares two arrays to check if they are equal. +description: Deeply compares two arrays to check if they are equal to each other (supports nested arrays and objects). author: KCSquid tags: array,object,compare,equal ---