2017-07-01 32 views
0

此問題是此問題的擴展:Checking containment in set of lists in javascript。我希望能夠在nodejs或Javascript中使用類似函數的設置,以支持檢查列表是否屬於集合。例如,給定鏈接中的示例,我希望以下行爲:可以檢查列表的遏制的圖書館或對象

var s = new SetWithListCheckingAbility([[1,2], [2,3]]) 
s.has([2, 3]) 
true 

但是,我無法找到任何具有此功能的nodejs庫。另一個明顯的解決方案似乎是JSON序列化每個添加到set對象的對象,並基於JSON字符串進行檢查,因爲Javascript相等性適用於字符串。這可能需要繼承ES6中的Set對象。然而,我不知道如何做這種情況下,這種情況下...

+0

你的名單隻包含數字嗎? –

+0

它將包含數字和字符串。 – Alex

回答

0

你可以做的是拿集的每個成員,並將其轉換爲字符串格式(this answer看起來像一個優雅的方式來做轉換數字到字符串)。

對於您的示例,如果您希望s.has([3, 2])返回false,因爲[2,3]不計爲匹配項,則數組到字符串轉換將看起來像array.join(','),否則array.sort().join(',')如果順序無關緊要。

function setOfListsHasElement(theSet, theElement) { 
    let newSet = new Set(); 
    theSet.forEach(e => newSet.add(e.join(','))); 
    return newSet.has(theElement.join(',')); 
} 

用法示例:

var theSet = new Set(); 
theSet.add([1,2]); 
theSet.add([2,3]); 
setOfListsHasElement(theSet, [2,3]); // true 
setOfListsHasElement(theSet, [3,2]); // false 
setOfListsHasElement(theSet, [2,6]); // false 
setOfListsHasElement(theSet, ["1", "2"]); // true - don't know how you want to handle scenarios like this, where the string representation of ["1", "2"] matches that of [1,2] 
+0

雖然這將會非常慢,因爲每次調用函數時都必須重新創建局部變量newSet。這就是爲什麼我在考慮繼承ES6集合類。 – Alex

0

我想出如何編寫自定義的類,它正是我們想要的:

class SetImproved extends Set{ 
    constructor(){ 
    super(); 
    this.classDict = {}; 
    this._size = 0; 
    } 

    get size(){ 
    return this._size 
    } 

    add(x){ 
    if(!(JSON.stringify(x) in this.classDict)){ 
     this._size += 1; 
    } 
    this.classDict[JSON.stringify(x)] = x; 
    } 

    has(x){ 
    return JSON.stringify(x) in this.classDict; 
    } 

    delete(x){ 
    if(JSON.stringify(x) in this.classDict){ 
     this._size -= 1; 
    } 
    delete this.classDict[JSON.stringify(x)]; 
    } 

    clear(){ 
    this.classDict = {}; 
    } 

    keys(){ 
    return Object.keys(this.classDict).map(x => this.classDict[x]); 
    } 

    entries(){ 
    return Object.keys(this.classDict).map(x => this.classDict[x]); 
    } 

} 

的功能的一些例子:

var setImproved = new SetImproved() 
setImproved.add([1, "b"]) 
setImproved.add([2, "c"]) 
setImproved.add(3) 
setImproved.add("asdf") 
console.log(setImproved.has([1, "b"])) 
console.log(setImproved.has([3])) 
setImproved.delete([4]) 
setImproved.delete([1, "b"]) 
console.log(setImproved.has(3)) 
console.log(setImproved.entries()) 
console.log(setImproved.size)