Heim > Web-Frontend > js-Tutorial > JavaScript-Spaßfrage: Tiefgehender Vergleich von Objekten

JavaScript-Spaßfrage: Tiefgehender Vergleich von Objekten

黄舟
Freigeben: 2017-01-22 14:38:09
Original
1723 Leute haben es durchsucht

Der Vergleich zweier Objekte in JavaScript ist keine leichte Aufgabe und es stellt selbst keine solche API bereit.

Wenn Sie den Operator „==" verwenden möchten, um zwei Objekte zu vergleichen, liegen Sie falsch.

Der Operator „==" gibt nur dann „true" zurück, wenn die linken und rechten Variablen auf dasselbe Objekt verweisen.

Im folgenden Beispiel wird beispielsweise definitiv false zurückgegeben.

var a = { name: 'Joe' };  
var b = { name: 'Joe' };  
a == b;  //-> false
Nach dem Login kopieren

Was ist also der Standard für den Vergleich zweier Objekte?

1. Haben sie denselben Attributnamen?

2. Haben sie denselben Attributwert?

Zum Beispiel haben die beiden Objekte a und b oben denselben Der Attributname „Name“ hat den Attributwert „Joe“, sodass man sagen kann, dass sie „ähnlich“ sind.

Mit anderen Worten, unser Ziel besteht dieses Mal darin, festzustellen, ob zwei JS-Objekte „ähnlich“ sind.

Die beiden oben genannten Objekte sind sehr einfach. Wenn wir auf die Situation verschachtelter Objekte stoßen, wird es kompliziert.

Da es viele Arten von Objekten gibt, wie z. B. reguläre Objekte, Funktionsobjekte und Datumsobjekte, erhöht der Vergleich die Komplexität des Programms. Daher betrachten wir hier nur einige Fälle: gewöhnliche Objekte ({. } ), Array-Objekte ([]) und einfache primitive Typen (String, Zahl, Boolean, Null, undefiniert).

Auch wenn die Anforderungen vereinfacht werden, ist es nicht einfach, diese Ähnlichkeit zu erreichen. Im Folgenden vergleiche ich die Attributnamen und -werte der Objekte einzeln.

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;  
};
Nach dem Login kopieren

Das Obige ist der Inhalt von JavaScript-interessanten Fragen: Ausführlicherer Vergleich von Objekten. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage