Skip to content
Prev Previous commit
Next Next commit
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
  • Loading branch information
KCSquid committed Jan 8, 2025
commit 6d4d53a2f7f644bc00a78130a9888fcf8e44dea1
3 changes: 2 additions & 1 deletion public/consolidated/javascript.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
71 changes: 19 additions & 52 deletions snippets/javascript/array-manipulation/compare-arrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,64 +2,31 @@
title: Compare Arrays
description: Compares two arrays to check if they are equal.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like the description to tell that it compares deeply two arrays since we added that

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
```