設定するJavaScript配列


144

MSDNはJavaScriptのSetコレクションの抽象化を参照しています。.delete()名前でさまざまな要素を削除()できるように、セットに変換するオブジェクトの配列があります。

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

この配列をセットに変換するにはどうすればよいですか?より具体的には、上記の配列を繰り返すことなくこれを行うことは可能ですか?ドキュメントは比較的不足しています(インスタンス化されたセットには十分ですが、可能であれば変換ではありません)。

キーによる削除のために、Mapへの変換を考えているかもしれません。私が達成しようとしているのは、(インデックスではなく)主にキーを介して要素にアクセスすることでアクセスまたは変更できる反復可能なコレクションです。

配列から別の配列への変換が最終的な目標です。


1
古いオブジェクトがあなたのために働くように聞こえます...
dandavis '10 / 10/15

3
@トーマス:何かが足りないので、学びたい。var s = new Set()、オブジェクトの追加、s.delete(whatever)の発行、およびvar o = {1: 'aaa'、2: 'bbbb' ...}と発行delete(o [の違いは何ですか? '1'])?
Veverke

1
@Veverkeは、最初のコメント(+1)よりも説明的でした。ありがとうございました。しかし、繰り返しますが、配列を繰り返し処理せずに配列の内容をオブジェクトに追加することなく、キーでアクセス可能な構造のようなリストを保持することはできますか?アイデアがあるようですね。詳しく説明する時間があれば、回答形式で表示してもかまいません。
Thomas

2
{"bob", "dole"}は有効なオブジェクトではないため、その配列オブジェクトは無効です。
アルニタク2015年

1
@Veverke ES6 SetMapいる問題を受けないそれらのデータ構造の「純粋な」実装されているObjectものは、そのプロトタイプに追加されていることができます。
アルニタク2015年

回答:


203

配列をSetコンストラクターに渡すだけです。Setコンストラクターはiterableパラメーターを受け入れます。Arrayオブジェクトはiterableプロトコルを実装しているため、有効なパラメーターです。

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

こちらをご覧ください


厳密に正しい。ただし、OPのデータは形式が正しくなく、したがって彼が何を期待しているのか正確に不明なので、自分で答えを追加することをためらっていた
Alnitak

10
これはIE11では機能しません。このコンストラクタはサポートされていません。ユーザーが使用するブラウザーがわからない場合は、回避します。
Eric

10

はじめに:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

そして、あなたは、例えば名前のセットが欲しいなら、あなたはそうするでしょう:

let namesSet = new Set(array.map(item => item.name));

3

レヴィが 言いましたコンストラクタに渡しについては正しいですが、あなたはまた、オブジェクトを使用することができます。

私は何だと思いVeverkeが言おうとしていることは、あなたが簡単に使用できるということですdeleteキーワードを、同じ効果を達成するためにオブジェクトの上に。

用語に混乱していると思います。 プロパティは、名前付きインデックスとして使用できるオブジェクトのコンポーネントです(そのように考えたい場合)。

次のようなものを試してください:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

次に、これを行うことができます:

delete obj["bob"];

オブジェクトの構造は次のようになります。

{
    "mr.": "peabody",
    "darkwing": "duck"
}

同じ効果があります。


1
おかげでアストロ:-)。実際、これにより「Setオブジェクトとプレーンオブジェクトの違いは何ですか」という疑問が生じました。上記のコメントで述べたように、「セット」は「クリア」の「機能が備わっているのは素晴らしい」を提供するラップアップタイプです。
Veverke

要するに、投稿のタイトルは「JavaScriptのSetオブジェクトとプレーンオブジェクトの違いは何ですか」に変更する必要があると思います。違いは何
ですか

@Veverke "Setオブジェクトとプレーンオブジェクトの違いは何ですか"は、ドキュメントを読むだけです..
Hacketo

1
@Hacketo:そのAPIで「クリア」を提供するセット以外は見つかりますか?
Veverke 2015年

1
これは興味深い答えです。受け取った以上のクレジットが必要だと思います。私に考えさせました。ありがとうございました!
トーマス

2

定義により、「セットは値のコレクションであり、各値は1回だけ発生する場合があります。」そのため、配列に繰り返し値がある場合、繰り返し値のうち1つの値のみがセットに追加されます。

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

そのため、配列に繰り返し値がある場合は、セットに変換しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.