2016-08-15 24 views
4

リストを追加したセットがあります。セットにJavascriptでリストが含まれているかどうかをチェックする

trueを返します:the specに基づいて

a.has([1]); 
> false 

タイプが比較される2つのオブジェクトに対して同じであれば、これが原因で起こることがあります

var a = new Set(); 
a.add([1]); 

今私は[1]aに存在するかどうかを確認しますxとyが同じオブジェクトを参照する場合それ以外の場合は、 falseを返します。

そして、これも起こる:

[1] == [1]; 
> false 

だから、セット.has()は平等(ただしわからない)を比較するための==を使用していることかもしれません。 JavaのようにJSのSet()に.contains()メソッドがありますか?

+0

すべてのオブジェクトに共通の「等価」メソッドがないため、このようなことはありません。あなたは 'set.values()'をとり、 'some'メソッドを使うことができます。 (しかし、2つの配列を比較する方法はあなたの責任です)。 – zerkms

+0

'[1]'はArrayオブジェクト_initializer_です。式として評価されるたびに、新しいArrayオブジェクトが作成され、発生した "リテラル指定子"に従って初期化されます。あなたは、あなたが好きなようにセット内の等しい値の要素を持つ多くの異なるArrayオブジェクトを持つことができます! – traktor53

答えて

10

配列とオブジェクトのような参照を比較することはできません(compare values, though)。

あなたが行っているやり方は、値が同じように見えても、別の参照と照合していることです。

var a = new Set(); 
var b = [1]; 

a.add(b); 

a.has(b); // => true 

MDN's Equality comparisons and samenessを見てみましょう:

はこのような何かを行います。

は、だから、セット.has()は必ずしも

ない(ないように注意してくださいが)平等を比較するために==を使用していることかもしれません。 [1] === [1](厳密な等価演算子を使用)もfalseを返します。

JSにはJavaのようにSet()メソッドのための.contains()メソッドがありますか?

あなたはそれを想像しているわけではありません。この答えの最初のリンクで述べたように、何らかの深い比較をすることができます。

4

両方とも[1]は同じ値を持っていますが、メモリ内の2つの異なる場所を指し示す2つの異なる配列であり、したがってそれらは等しくありません。

あなたは、彼らが対等になることはありません「==」演算子を持つ2つの配列を比較した場合、あなたは

for (let item of mySet.keys()) { 
    item.toString() == [1].toString(); 
    //true on match. 
} 
0

をチェックするための基本的なループを使用することができます。彼らは別のインスタンスです。

あなたは配列オブジェクトを使用したい場合:

  1. は、2つの配列を比較する方法を定義します。
  2. Setのサブクラスを作成し、 "has"メソッドをオーバーライドします。

function eqArray (a1, a2) { 
    if (!(a1 instanceof Array && a2 instanceof Array)) 
     return false; 
    if (a1.length != a2.length) 
     return false; 
    for (var i = 0, n=a1.length; i < n; i++) { 
     if (a1[i] instanceof Array && a2[i] instanceof Array) { 
      if (!eqArray(a1[i], a2[i])) 
       return false;  
     }   
     else if (a1[i] != a2[i]) 
      return false;  
    }  
    return true; 
} 

function MySet(elems) { 
    var set = new Set (elems); 
    set.__proto__ = MySet.prototype; 
    return set; 
} 

MySet.prototype = new Set; 

MySet.prototype.has = function (elem) { 
    if (elem instanceof Array){ 
     for (var v of this) { 
     if (v instanceof Array && eqArray(elem,v)) 
     return true; 
     } 
     return false; 
    }else { 
     return Set.prototype.has.call (this, elem); 
    } 
} 

var a = new MySet(); 
a.add([1]); 

a.has([1]); //true 

eqArray([1],[1]); //true 
+2

グローバルな試作品を変更することはお勧めしません。それは絶対にひどい習慣です。特別なセットが必要な場合は、サブクラスまたはその他のラッパーオブジェクトを作成します。 – loganfsmyth

+0

ありがとうございました。私は答えを編集する – fbohorquez

関連する問題