Es gibt keine einfache Möglichkeit, dies zu tun. Ich brauchte dies auch, wollte aber eine Funktion, die zwei beliebige Variablen nehmen und auf Gleichheit testen kann. Das schließt Nicht-Objekt-Werte, Objekte, Arrays und jede Ebene der Verschachtelung ein.
In Ihrer Frage erwähnen Sie, dass Sie die Reihenfolge der Werte in einem Array ignorieren wollen. Meine Lösung tut das nicht von Haus aus, aber Sie können es erreichen, indem Sie die Arrays vor dem Vergleich auf Gleichheit sortieren
Außerdem wollte ich die Möglichkeit haben, Nicht-Objekte in Strings umzuwandeln, so dass [1,2]===["1",2]
Da mein Projekt UnderscoreJs verwendet, habe ich beschlossen, es zu einem Mixin zu machen und nicht zu einer eigenständigen Funktion.
Sie können es ausprobieren auf http://jsfiddle.net/nemesarial/T44W4/
Hier ist mein Mxin:
_.mixin({
/**
Tests for the equality of two variables
valA: first variable
valB: second variable
stringifyStatics: cast non-objects to string so that "1"===1
**/
equal:function(valA,valB,stringifyStatics){
stringifyStatics=!!stringifyStatics;
//check for same type
if(typeof(valA)!==typeof(valB)){
if((_.isObject(valA) || _.isObject(valB))){
return false;
}
}
//test non-objects for equality
if(!_.isObject(valA)){
if(stringifyStatics){
var valAs=''+valA;
var valBs=''+valB;
ret=(''+valA)===(''+valB);
}else{
ret=valA===valB;
}
return ret;
}
//test for length
if(_.size(valA)!=_.size(valB)){
return false;
}
//test for arrays first
var isArr=_.isArray(valA);
//test whether both are array or both object
if(isArr!==_.isArray(valB)){
return false;
}
var ret=true;
if(isArr){
//do test for arrays
_.each(valA,function(val,idx,lst){
if(!ret){return;}
ret=ret && _.equal(val,valB[idx],stringifyStatics);
});
}else{
//do test for objects
_.each(valA,function(val,idx,lst){
if(!ret){return;}
//test for object member exists
if(!_.has(valB,idx)){
ret=false;
return;
}
// test for member equality
ret=ret && _.equal(val,valB[idx],stringifyStatics);
});
}
return ret;
}
});
So verwenden Sie es:
_.equal([1,2,3],[1,2,"3"],true)
Um die Verschachtelung zu demonstrieren, können Sie Folgendes tun:
_.equal(
['a',{b:'b',c:[{'someId':1},2]},[1,2,3]],
['a',{b:'b',c:[{'someId':"1"},2]},["1",'2',3]]
,true);