a
とb
はJavaScriptでオブジェクトであり、a
と場合a == b
かa === b
が唯一の真実でありますは同じインスタンスを指します。
例:具体的な比較方法については
var a = [], b = [], c = a;
alert(a == b); // False
alert(a == c); // True
、私はArrayオブジェクトを汚染しないように、カスタム配列コンストラクターを作成することをお勧め:
function lote() {} // Your lote constructor
var customArray = function() {
return Array.apply(this, arguments);
}
customArray.prototype = new Array;
customArray.prototype.contains = function(obj) {
var i = this.length;
// Not designed for non-"lote" instances, return null
if (!(obj instanceof lote)) return null;
while (i--) {
var current = this[i];
if (current.idlote === obj.idlote &&
current.nmlote === obj.nmlote &&
current.idquadro === obj.idquadrio) return true;
}
return false;
}
代わりにハードコーディングプロパティ名の、 Object.keys()
を使用してオブジェクトのプロパティをループすることもできます。
customArray.prototype.contains = function(obj) {
var i = this.length;
// Not designed for non-"lote" instances, return null
if (!(obj instanceof lote)) return null;
var keys = Object.keys(obj), keysLen = keys.length;
// Labeled loop
loop: while (i--) {
var current = this[i];
var len = keysLen, key;
for (len--) {
key = keys[len];
if (current[key] !== current[key]) {
len = -1;
continue loop; //Not equal, go to the next item in the outer loop
}
}
return true; // At this point, every property was equal.
}
return false;
}
示された方法は、与えられたobj
の特性に基づいていることに注意してください。有効なlote
オブジェクトでない場合、この関数はnull
を返します。 Object.keys
は、指定されたobj
のすべてのプロパティを取得します。
配列のプロトタイプを拡張することは、すでに難しいです。今度は 'Object'のプロトタイプをオーバーライドすることを提案していますか? –
これは私が見つけることができるあなたの質問に最も近い解決策です。もちろん、equals(a、b)という2つのパラメータを持つスタンドアロン関数に関数equalsを置き換え、すべてのthisを関数内のaと置き換え、すべてのxをbで置き換えることができます。しかし解決策は同じです:すべてのオブジェクトメンバを深く比較する必要があります –