Maison > interface Web > js tutoriel > Question amusante JavaScript : comparaison approfondie des objets

Question amusante JavaScript : comparaison approfondie des objets

黄舟
Libérer: 2017-01-22 14:38:09
original
1690 Les gens l'ont consulté

Comparer deux objets en JavaScript n'est pas une tâche facile, et il ne fournit pas lui-même une telle API.

Si vous souhaitez utiliser l'opérateur "==" pour comparer deux objets, vous vous trompez.

L'opérateur "==" retournera vrai uniquement lorsque les variables gauche et droite pointent vers le même objet.

Par exemple, dans l'exemple suivant, false sera définitivement renvoyé.

var a = { name: 'Joe' };  
var b = { name: 'Joe' };  
a == b;  //-> false
Copier après la connexion

Alors, quelle est la norme pour comparer deux objets ?

1. Ont-ils le même nom d'attribut

2. Ont-ils la même valeur d'attribut

Par exemple, les deux objets a et b ci-dessus, ils ont tous les deux Le nom d'attribut "name" a la valeur d'attribut "Joe", on peut donc dire qu'ils sont "similaires".

En d'autres termes, notre objectif cette fois est de déterminer si deux objets JS sont "similaires".

Les deux objets ci-dessus sont très simples. Si nous rencontrons des objets imbriqués dans des objets, cela deviendra compliqué.

Comme il existe de nombreux types d'objets, tels que les objets normaux, les objets fonction et les objets date, leur comparaison augmentera la complexité du programme. Par conséquent, nous ne considérons ici que quelques cas : les objets ordinaires ({. } ), les objets tableau ([]) et les types primitifs simples (chaîne, nombre, booléen, nul, non défini).

Même si les exigences sont simplifiées, il n'est pas facile d'obtenir cette similitude. Ci-dessous, j'utilise une traversée approfondie des objets pour comparer les noms d'attributs et les valeurs des objets un par un.

function deepCompare(o1, o2) {  
    //标识是否相似  
    var flag = true;  
      
    var traverse = function(o1,o2){  
        //如果至少有一个不是对象  
        if(!(o1 instanceof Object) || !(o2 instanceof Object)){  
            if(o1 !== o2){  
                flag = false;  
            }  
            return;  
        }  
        //如果两个对象的属性数量不一致  
        //比如:  
        //a:{name:"Jack",age:22}  
        //b:{name:"Jack"}  
        if(Object.keys(o1).length != Object.keys(o2).length){  
            flag = false;  
        }  
        //若有不同之处,尽早结束递归  
        if(flag){  
            //深度遍历对象  
            for(var i in o1){  
                //若都是对象,继续递归  
                if(typeof o1[i] === "object" && typeof o2[i] === "object"){  
                    traverse(o1[i],o2[i]);  
                }//若都不是对象,则比较值  
                else if(typeof o1[i] !== "object" && typeof o2[i] !== "object"){  
                    if(o1[i] !== o2[i]){  
                        flag = false;;  
                    }  
                }//一个是对象,一个不是对象,肯定不相似  
                else{  
                    flag = false;  
                }  
            }  
        }  
    };  
      
    traverse(o1,o2);  
      
    return flag;  
};
Copier après la connexion

Ce qui précède est le contenu des questions intéressantes JavaScript : comparaison approfondie des objets. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com) !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal