1. ホーム
  2. javascript

[解決済み] ECMA6集合の等質性比較

2022-05-11 13:29:19

質問

2つのjavascriptセットを比較する方法は?を使ってみました。 ===== が、どちらもfalseを返します。

a = new Set([1,2,3]);
b = new Set([1,3,2]);
a == b; //=> false
a === b; //=> false

この2つのセットは、定義上、等価である。 じゅんばんはない (少なくとも普段は)ありません。を見てきました。 MDNにあるSetのドキュメント どなたか、この方法をご存知の方はいらっしゃいますか?

どのように解決するのですか?

これを試してみてください。

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

alert(eqSet(a, b)); // true

function eqSet(as, bs) {
    if (as.size !== bs.size) return false;
    for (var a of as) if (!bs.has(a)) return false;
    return true;
}

より機能的なアプローチといえるでしょう。

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

alert(eqSet(a, b)); // true

function eqSet(as, bs) {
    return as.size === bs.size && all(isIn(bs), as);
}

function all(pred, as) {
    for (var a of as) if (!pred(a)) return false;
    return true;
}

function isIn(as) {
    return function (a) {
        return as.has(a);
    };
}

があります。 all 関数は,すべての反復可能なオブジェクトに対して機能します(例えば SetMap ).

もし Array.from がもっと広く支持されていれば、実装できたかもしれません。 all として機能します。

function all(pred, as) {
    return Array.from(as).every(pred);
}

お役に立てれば幸いです。