Using idMap property for can.Lists

The bitballs application uses an idMap property on the players list to avoid sequentially scanning the list each time you want to get a player by id. This doesn’t actually seem to be the case. The idMap gets regenerated for each call to getById

The expected output for this would be:

getById
idMap
getById
getById

But it is actually:

getById
idMap
getById
idMap
getById
idMap

How can we create a property that is generated once and is only updated if an observable property it references changes?