【问题标题】:Realm-JS: Performant way to find the index of an element in sorted results listRealm-JS:在排序结果列表中查找元素索引的高效方法
【发布时间】:2020-07-03 15:42:00
【问题描述】:

我正在寻找一种在排序结果列表中查找给定领域对象索引的高性能方法。 我知道this 类似的问题,使用indexOf 回答了这个问题,所以我目前的解决方案如下所示:

const sortedRecords = realm.objects('mySchema').sorted('time', true) // 'time' property is a timestamp

// grab element of interest by id (e.g. 123)
const item = realm.objectForPrimaryKey('mySchema','123')

// find index of that object in my sorted results list
const index = sortedRecords.indexOf(item)

我最关心的是大型数据集的性能。领域列表的indexOf 实现是否以任何方式对此进行了改进,还是与 JavaScript 数组中的相同?我知道有可能创建indexed properties,索引time 属性会提高这种情况下的性能吗?

注意: 在 realm-js api 文档中,indexOf section 不像其他部分那样引用 Array.prototype.indexOf。这让我很乐观,它是一个自己的实现,但没有明确说明。

【问题讨论】:

  • 您是否对领域.indexOf() 进行了测试/基准测试?你能用console.log(sortedRecords.indexOf); console.log 函数吗?然后将其与原生 JS 数组 .indexOf() 进行比较? - 我希望如果您的领域对象知道它已排序(当您调用.sorted('time', true) 时,.indexOf() 实现可以在基于该字段进行搜索时使用这个事实。但是,如果时间不是主键,它不一定有助于对记录进行排序?主键是时间字段吗?(如果不是,时间字段是唯一的吗?您是否要构建自定义查找?)
  • id 和 time 之间有关系吗?我的意思是 ids 也排序了吗?

标签: javascript arrays realm indexof realm-js


【解决方案1】:

Realm 查询方法返回一个 Results 对象,这与 Array 对象完全不同,主要区别在于第一个对象可以随时间变化,即使没有调用它的方法:添加和/或删除记录到源架构可能会导致对 Results 对象的更改。

Results.indexOfArray.indexOf 之间唯一的共同点是方法的名称。

说起来容易也说不通,比较两种方法的效率是没有意义的。

一般来说,所有indexOf 实现的共同问题是它们需要顺序扫描,并且在最坏的情况下(即未找到的情况)需要完全扫描。针对 10 个元素执行的indexOf 麦芽汁对程序性能没有影响,而针对 1M 个元素执行的最佳实现indexOf 可能对程序性能产生严重影响。如果可能,最好避免对大量数据使用indexOf

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2019-01-23
    • 2020-01-16
    • 2013-07-26
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多