2017-09-23 55 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?

希望这可能会有帮助。

相关问题