2012-01-25 3 views
0

が動作していません私のコード:私はOを持つ配列を希望実装含まは、私はそれが動作していない、いくつかのオブジェクトが既に配列に存在する場合見つけるために、このコードを試みたが、た

[ 
lote 
idlote: "2" 
idquadro: "1" 
nmlote: "Lote 1" 
__proto__: lote 
, 
lote 
idlote: "2" 
idquadro: "1" 
nmlote: "Lote 1" 
__proto__: lote 
, 
lote 
idlote: "2" 
idquadro: "1" 
nmlote: "Lote 1" 
__proto__: lote 
] 

そして:

$(data).each(function(index){ 
if(this.idlote!=""){ 
    loLote = new lote(this.idlote, this.nmlote, this.quadro); 
    if(!laLote.contains(loLote)){ 
     laLote.push(loLote); 
    } 
} 
}); 
console.log(laLote); 

配列はこのように表示されます次のような要素が1つあります。

[ 
lote 
idlote: "2" 
idquadro: "1" 
nmlote: "Lote 1" 
__proto__: lote 
] 

コードはどこで修正できますか?

おかげで、 ルチアーノ

答えて

0

私はあなたが機能をはObject.equals使用する方法「を含んで」、そしてあなたがObject comparison in JavaScriptから抽出されたオブジェクト比較の

Array.prototype.contains = function(obj){ 
    var i = this.length; 
    while(i--){ 
     console.log(i); 
     if(this[i].equals(obj)) return true; 
    } 
    return false; 
}; 

Object.prototype.equals = function(x){ 
    var p; 
    for(p in this) { 
     if(typeof(x[p])=='undefined') {return false;} 
    } 

    for(p in this) { 
     if (this[p]) { 
      switch(typeof(this[p])) { 
       case 'object': 
        if (!this[p].equals(x[p])) { return false; } break; 
       case 'function': 
        if (typeof(x[p])=='undefined' || 
         (p != 'equals' && this[p].toString() != x[p].toString())) 
         return false; 
        break; 
       default: 
        if (this[p] != x[p]) { return false; } 
      } 
     } else { 
      if (x[p]) 
       return false; 
     } 
    } 

    for(p in x) { 
     if(typeof(this[p])=='undefined') {return false;} 
    } 

    return true; 
} 

コードのコードを使用することができます変更すべきだと思います

+0

配列のプロトタイプを拡張することは、すでに難しいです。今度は 'Object'のプロトタイプをオーバーライドすることを提案していますか? –

+0

これは私が見つけることができるあなたの質問に最も近い解決策です。もちろん、equals(a、b)という2つのパラメータを持つスタンドアロン関数に関数equalsを置き換え、すべてのthisを関数内のaと置き換え、すべてのxをbで置き換えることができます。しかし解決策は同じです:すべてのオブジェクトメンバを深く比較する必要があります –

1

abはJavaScriptでオブジェクトであり、aと場合a == ba === 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のすべてのプロパティを取得します。

+0

ああ、ところで 'laLote'配列は' var laLote = new customArray(); 'を使って作成する必要があります。 –

関連する問題

 関連する問題