Well, this is a read-only operation for most of the DOM elements.  It only actually modifies the DOM when it calls `updateRowSelection()` at the end, and then only the elements on screen.

With 1000 contacts this takes 15ms to 45ms to run.  With 2000 contacts it takes 30ms to 60ms to run.  This seems well within the 140ms goal for cause and effect.  I suppose with > 5000 contacts it might get slow enough to be an issue.

I'll rework it to track contact IDs in a js memory structure.