Junior
Kuidas võrrelda objekte JavaScriptis?
sobes.tech AI
Vastus AI-lt
JavaScriptis otsene võrdlus === või == kontrollib viidete identiivsust, mitte nende sisu võrdlust. Objekti sisu võrdlemiseks on järgmised lähenemised:
-
Lame võrdlus:
- Kontrollib, kas esimesel tasemel võtmed ja väärtused kattuvad.
- Kasutatakse "lame" objektide puhul, kus pole sisemisi objekte või massiive.
- Võib käsitsi rakendada, läbides võtmeid või kasutades
Object.keys()jaevery().
// Näide lame võrdluse const areEqualShallow = (obj1, obj2) => { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) { return false; } for (let key of keys1) { if (obj1[key] !== obj2[key]) { return false; } } return true; }; -
Sügav võrdlus:
- Rekursiivselt kontrollib kõiki sisemisi objekte ja massiive.
- Vajalik keerukate andmestruktuuride õige võrdlemise jaoks.
- Võib kasutada rekursiooni või iteratiivset lähenemist steki kasutades.
- Nõuab erinevate andmetüüpide (primitivid, objektid, massiivid, kuupäevad, regulaaravaldised) töötlemist.
-
Võrdlus
JSON.stringify()kasutades:- Muudab objektid JSON-stringideks ja võrdleb neid.
- Lihtne meetod, kuid omab piiranguid:
- Ei arvesta võtmete järjekorda objektides.
- Ei tööta funktsioonide,
undefined,NaN,Infinitypuhul. - Võib olla ebaefektiivne väga suurte objektide puhul.
// Näide võrdlusest `JSON.stringify()` abil const areEqualJSON = (obj1, obj2) => { return JSON.stringify(obj1) === JSON.stringify(obj2); }; -
Kolmanda osapoole teekide kasutamine:
- Teegid nagu
lodash(funktsioon_.isEqual) võideep-equalpakuvad usaldusväärseid ja optimeeritud süva võrdluse rakendusi, arvestades paljusid nüansse (tsüklilised viited, erinevad tüübid, äärejuhtumid).
- Teegid nagu
Valik sõltub vajalikust täpsusest ja võrdluses olevate objektide keerukusest. Lihtsate juhtumite puhul piisab lamevõrdlusest või JSON.stringify()-st. Keerukamate struktuuride puhul on soovitatav kasutada süva võrdlust või valmis teeke.