在字典中查找具有特定 属性 的值

Find a Value in a Dictionary with a certain Property

假设我有一本像

这样的字典
objDict = {
  id1 : { name: 'someObj1', id: 'someId1' },
  id2 : { name: 'someObj2', id: 'someId2' },
  id3 : { name: 'someObj3', id: 'someId3' },
}

如果我想在 Values of that dictionary 中搜索 属性 "someId2" of the "id" 属性.. 我怎样才能找到找到整个对象后?

除了用 for-in 循环迭代字典之外,我真的想不出什么好方法。我正在考虑使用 Object.values() 但即使那样我也想不出一种方法来使用它来获取包含 someId2 的整个对象..我只能确定 属性存在。

我只是想知道是否有比 for-in 循环更好的方法。谢谢

这是一个一般的索引问题,所以不,除了遍历字典中的每个值之外,没有什么好的方法可以解决这个问题。这是因为你已经创建了一个数据结构来快速访问数据(O(1) 时间),但缺点是如果你想通过另一个索引快速找到数据,你将不得不手动搜索 O(n ) 是时候了。

如果您真的关心 someId 的实际值,那么规范的答案是创建 2 个单独的字典,其中包含相同的数据和不同的键值。这与在数据库 table.

上有 2 个索引非常相似

您可以使用 Object.keys() 获取所有键,然后根据所需的 ID 迭代这些键和 select 您想要的对象。

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);

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))

以下包含 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 Script 2015 提供了另一种使用 Map object 的替代方法,如

中所述

希望这可能有所帮助。