2016-08-15 86 views
4

我有一套我已經添加了一個列表。檢查一個集合是否包含一個使用Javascript的列表

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

現在我檢查是否存在a[1]:基於the spec

a.has([1]); 
> false 

,這可能發生,因爲如果被比較的類型是相同的兩個對象:

,則返回true如果x和y指的是同一個對象。否則,返回 false。

而這也正好:

[1] == [1]; 
> false 

因此,它可能是設置.has()使用==比較平等的(不知道雖然)。像Java一樣,JS中的Set()方法是否有.contains()

+0

沒有這樣的事情,因爲沒有對每個對象的通用'equals'方法。你可以使用'set.values()'並使用'some'方法。 (但是這是你如何比較兩個陣列的責任)。 – zerkms

+0

'[1]'是一個數組對象_initializer_。每次將其作爲表達式求值時,都會根據遇到的「字面說明符」創建並初始化一個新的Array對象。你可以在一個Set中擁有許多不同的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看看。

因此,它可能是設置。先後()使用==比較平等的(不知道雖然)

不一定。 [1] === [1](使用嚴格相等運算符)也返回false

是否有像Java一樣的JS中的Set()方法的.contains()方法?

不像你想象的那樣。您可以進行某種深度比較,如此答案的第一個鏈接中所述。

4

儘管兩個[1]都具有相同的值,但它們是兩個不同的數組,指向內存中的兩個不同位置,因此它們不相等。

你可以使用一個基本的循環來檢查

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

如果你比較兩個數組與「==」運營商,他們將永遠不會平等。他們是不同的實例。

如果要使用一個數組對象:

  1. 定義兩個數組如何比較。
  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

相關問題