Search code examples
javascriptarraysrealmindexofrealm-js

Realm-JS: Performant way to find the index of an element in sorted results list


I am searching for a perfomant way to find the index of a given realm-object in a sorted results list. I am aware of this similar question, which was answered with using indexOf, so my current solution looks like this:

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)

My basic concern here is performance for lager datasets. Is the indexOf implementation of a realm-list improved for this in any way, or is it the same as from a JavaScript array? I know there is the possibility to create indexed properties, would indexing the time property improve the performance in this case?

Note: In the realm-js api documentation, the indexOf section does not reference to Array.prototype.indexOf, as other sections do. This made me optimistic it's an own implementation, but it's not stated clearly.


Solution

  • Realm query methods return a Results object which is quite different from an Array object, the main difference is that the first one can change over time even without calling methods on it: adding and/or deleting record to the source schema can result in a change to Results object.

    The only common thing between Results.indexOf and Array.indexOf is the name of the method.

    Once said that is easy to also say that it makes no sense to compare the efficiency of the two methods.

    In general, a problem common to all indexOf implementations is that they need a sequential scan and in the worst case (i.e. the not found case) a full scan is required. The wort implemented indexOf executed against 10 elements has no impact on program performances while the best implemented indexOf executed against 1M elements can have a severe impact on program performances. When possible it's always a good idea avoiding to use indexOf on large amounts of data.

    Hope this helps.