2017-07-01 6 views
0

この質問の拡張版はChecking containment in set of lists in javascriptです。私は、リストがコレクションに属するかどうかのチェックをサポートできるnodejまたはJavascriptのような関数を使用できるようにしたい。しかし、リストの包含を確認できるライブラリまたはオブジェクト

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

私はこの機能を持っている任意のnodejsライブラリを見つけることができませんでした:たとえば、リンクの例を考えると、私は行動をしたいと思います。もう1つの明らかな解決策は、setオブジェクトに追加された各オブジェクトをJSONでシリアライズすること、JSON文字列に基づいてチェックすることです。これはおそらく、ES6でSetオブジェクトをサブクラス化する必要があります。しかし、私はこの場合どのようにこれを行うかわかりません...

+0

あなたのリストには数字だけが含まれますか? –

+0

数字と文字列が含まれます。 – Alex

答えて

0

あなたができることは、セットの各メンバーを取り、それを文字列形式に変換することです(this answerはその変換を行うためのエレガントな方法です数字を文字列に変換します)。ご例えば

[2,3]一致としてカウントされませんので、あなたがs.has([3, 2])はfalseを返すようにしたい場合は、文字列への変換配列は、そうでない場合はarray.sort().join(',')注文した場合は関係ありません、array.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) 
関連する問題