在字典中查找具有特定 属性 的值
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
的替代方法,如
中所述
希望这可能有所帮助。
假设我有一本像
这样的字典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.
您可以使用 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
的替代方法,如
希望这可能有所帮助。