2017-09-23 100 views
1

說我有喜歡查找字典的價值具有一定的屬性

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

字典如果我要尋找那本詞典的價值的「標識」屬性的財產「someId2」 ..在找到它之後,我將如何抓住整個物體?

我真的不能想出一個很好的方法來在迭代字典和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個單獨的字典/相同的數據/不同的鍵值。這與在數據庫表上有兩個索引非常相似。

1

Object.entries(),但for-in循環比其他替代品更有效。

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;語句可以統計提供更好的性能與所選擇的一個下面的代碼片段。

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腳本2015提供如所述,使用Map object的另一替代:How to iterate (keys, values) in javascript?

希望這可能會有幫助。

相關問題