【问题标题】:Find a Value in a Dictionary with a certain Property在具有特定属性的字典中查找值
【发布时间】:2017-09-23 01:00:23
【问题描述】:

假设我有一本类似的字典

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

如果我想在该字典的 Values 中搜索“id”属性的属性“someId2”.. 找到后如何抓取整个对象?

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

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

【问题讨论】:

  • 遍历字典将是性能和可读性方面的最佳解决方案。
  • how would I be able to grab the the whole object after finding it? 这是你的问题吗?或者您在问如何在字典中搜索该值?
  • @jack 理想情况下我喜欢做类似 objDict.find( x => x.id === 'someId2' ) 的事情,但它不是一个数组。这是一本字典。所以是的,这是一个问题,我想得到整个对象。
  • 这里有几个替代方案 (stackoverflow.com/questions/34913675/…) 但@Slai 绝对正确:for-in 循环将提供最佳性能(另外,您可以在找到第一个条目时中断循环)跨度>

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

您可以使用 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);

【讨论】:

  • 这看起来是我将得到的最干净的解决方案。但我想这在技术上与 for-in 循环做同样的事情,我正确吗?
  • 是的,它是一样的,我看不出比当前数据结构更好的线性解决方案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下包含 break; 语句的代码 sn-p 在统计上可以提供比所选代码更好的性能。

    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 的替代方法,如:How to iterate (keys, values) in javascript?

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

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

      如果您真的关心someId 的实际值,那么规范的答案是创建两个单独的字典,其中包含相同的数据和不同的键值。这与在一个数据库表上有 2 个索引非常相似。

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2022-07-02
        • 1970-01-01
        • 2011-04-16
        • 2014-07-28
        相关资源
        最近更新 更多