2017-09-23 13 views
1

で辞書内の値を探すには、私はその辞書の値が「ID」プロパティのプロパティ「someId2」を検索したい場合は、私は特定のプロパティ

objDict = { 
    id1 : { name: 'someObj1', id: 'someId1' }, 
    id2 : { name: 'someObj2', id: 'someId2' }, 
    id3 : { name: 'someObj3', id: 'someId3' }, 
} 

などの辞書を持っていると言います。..それを見つけた後、私はどのようにオブジェクト全体をつかむことができますか?

for-inループを使用して辞書を反復処理する以外の方法を考えるのは本当に難しいと思います。私はObject.values()を使用することを考えていましたが、それでもsomeId2を含むオブジェクト全体を取得する方法を考える方法はありません。そのプロパティが存在するかどうかしか判断できませんでした。

for-inループよりも良い方法があるのか​​どうか疑問に思っていました。ありがとう

+0

辞書を反復すると、パフォーマンスと可読性の点で最適なソリューションになります。 –

+0

「見つけた後、どのようにオブジェクト全体をつかむことができますか?」これはあなたの質問ですか?または、その値のために辞書を検索する方法を尋ねていますか? – jack

+0

@jack理想的には、idはobjDict.find(x => x.id === 'someId2')のようなことをするのが大好きですが、配列ではありません。それは辞書です。だからそれは問題です。私はオブジェクト全体を取得したいと思います。 – user1189352

答えて

3

Object.keys()を使用してすべてのキーを取得してから、これらのオブジェクトを反復処理して、必要なIDに基づいてオブジェクトを選択することができます。

var objDict = { 
 
    id1 : { name: 'someObj1', id: 'someId1' }, 
 
    id2 : { name: 'someObj2', id: 'someId2' }, 
 
    id3 : { name: 'someObj3', id: 'someId3' }, 
 
}; 
 
var obj; 
 

 
Object.keys(objDict).forEach(x => obj = objDict[x].id === 'someId2' ? objDict[x]: obj); 
 

 
console.log(obj);

+0

これは私が得るつもりの最もクリーンなソリューションのようですしかし、私はこれが技術的にfor-inループと同じことをやっていると思います。 – user1189352

+0

はい、その同じ、私は現在のデータ構造と線形のソリューションよりもよく見えません。 – Dij

0

これは一般的なインデックスの問題です。いいえ、辞書の各値をループする以外の方法はありません。これは、データに迅速にアクセスするためのデータ構造(O(1))を作成したためですが、別のインデックスを介してデータを素早く検索したい場合、O(n )それのための時間。

実際にsomeIdの実際の値を気にしていた場合、標準的な答えは、別のキー値で同じデータで2つの別々の辞書を作成することです。これは、データベーステーブルに2つのインデックスを持つ場合と非常によく似ています。

1

ありObject.entries()ですが、ためにインループは、他の選択肢よりも効率的です。

objDict = { id1 : { name: 'someObj1', id: 'someId1' }, 
 
      id2 : { name: 'someObj2', id: 'someId2' }, 
 
      id3 : { name: 'someObj3', id: 'someId3' } } 
 

 
item = Object.entries(objDict).find(a => a[1].id === 'someId2') 
 

 
console.log(JSON.stringify(item))

1

break;文を含む次のコードスニペットは、統計的に選択された1対優れたパフォーマンスを提供することができます。で説明したように

objDict = { 
 
    id1 : { name: 'someObj1', id: 'someId1' }, 
 
    id2 : { name: 'someObj2', id: 'someId2' }, 
 
    id3 : { name: 'someObj3', id: 'someId3' }, 
 
}; 
 
var obj; 
 
for (var key in objDict) 
 
{ 
 
    if (objDict[key].id==='someId2') 
 
    { 
 
    obj = objDict [key]; 
 
    break; 
 
    } 
 
} 
 
console.log(obj);

ECMAスクリプト2015Map objectを使用して別の選択肢を提供します:How to iterate (keys, values) in javascript?

これが役立つことを願っています。

関連する問題