2017-07-29 12 views
1

javascriptの "Set"オブジェクトを使用して特定のキーを持つ要素を見つけることはできますか?そのような 何か:その方法でセット内のオブジェクトキーのJavascript検索

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
let mySet = new Set(myObjects); 
console.log(mySet.has({"name":"a"})); 

答えて

5

ない、セットではありませんあなたが渡している特定のオブジェクト、ためになります。

あなたの出発点は、オブジェクトの配列である場合は、あなただけArray.prototype.find、まったくSetを必要としない:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let found = myObjects.find(e => e.name === "a"); 
 
console.log(found);

あなたはすでにSetを持って検索したい場合はそれは試合のために、あなたはfor-ofを経由して、直接、そのイテレータを使用することができます。

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = undefined; // the `= undefined` is just for emphasis; that's the default value it would have without an initializer 
 
for (const e of mySet) { 
 
    if (e.name === "a") { 
 
    found = e; 
 
    break; 
 
    } 
 
} 
 
console.log(found);
経由

...または間接的に(再)へ、その後()配列、およびfindを使用して作成します。それはあなたのものなら

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = Array.from(mySet).find(e => e.name === "a"); 
 
console.log(found);


を頻繁に行う必要がある場合は、自分自身にユーティリティ関数を与えることができます:

const setFind = (set, cb) => { 
 
    for (const e of set) { 
 
    if (cb(e)) { 
 
     return e; 
 
    } 
 
    } 
 
    return undefined; // undefined` just for emphasis, `return;` 
 
        // would do effectively th same thing, as 
 
        // indeed would just not having a `return` 
 
        // at at all 
 
} 
 

 
let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = setFind(mySet, e => e.name === "a"); 
 
console.log(found);

あなたも、(例えば、私は驚いすべてでではないでしょう(必ずそれが非可算だ作り)Set.prototypeにそれを置くが、Setに将来の追加と競合には注意してください可能性がありある時点でSet.prototypefindメソッドがある場合)。

+0

は、あなたの答えをありがとう、私は 'Set'で検索することをどこかで読んだように、私の質問は、好奇心から、単純でしたオブジェクトはO(1)の複雑さを有する。 –

+0

* sthが入っているかチェック*!== *検索* –

+0

@Jonasw:True!アレクサンドル、ブール値の結果が必要な場合は、上記の 'find'ではなく' some'を使います(それに応じて 'for-of'を調整します)。 –

5

を名前の設定をちょうどよいでしょう:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 

let map = new Set(myObjects.map(el=>el.name)); 
console.log(map.has("a")); 

名前でオブジェクトを取得したい場合は、地図が何のためにあるのか厥:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 

let map = new Map(myObjects.map(el=>[el.name,el])); 
console.log(map.get("a")); 
+1

'Map'は動作しますが、これはa * set *のためのものです:' let mySet = new Set(myObjects.map(e => e.name)); console.log(mySet.has( "a")); '(これを解決する場合) –

1

短い答え - いいえ。 Set.hasはオブジェクトの等価性で動作し、リスト内の各オブジェクトは一意であるため、.hasに新しいオブジェクトを渡すと、同じキーと値を持っていてもtrueを返しません。

いつでも元のリストをフィルタリングできます。結果のリストの長さがゼロより大きい場合、オブジェクトはその中に含まれます。

const containsObjectWithName = ({ name }) => 
    !!myObjects 
    .filter((obj) => obj.name === name) 
    .length; 

containsObjectWithName({ name: 'a' }); // true 
2

あなたが設定でこれを行うにしたい場合は、あなたが探しているオブジェクトが追加されたのと同じオブジェクトではなく、匿名オブジェクトである必要があります。

それは次のように設定されたのであれば、あなたが探しているものを達成できる:

let myObject = {"name": "a", "value": 0}; 
let set = new Set([myObject]); 

console.log(set.has(myObject)); 

set.has()は、ボンネットの下にSameValueZero()使用するためです。ここで

set.has()のための仕様です:http://www.ecma-international.org/ecma-262/6.0/#sec-set.prototype.has

そしてSameValueZero()用:http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

+0

これは、OPが尋ねたことをしません。この質問には、2つの別々のオブジェクトがあります(1つは配列に、もう1つは検索対象となります)。単一のオブジェクトではありません。 –

関連する問題