Fix check in oneday.js and performance improvements

In looking over the code in preprocessing.js I noticed that oneday.js's check for no data wasn't actually doing what we hoped it would. a is an object and the length of an object is undefined by default, so all it was doing was checking the truthyness of a.

As I was looking over the code, I also noticed that preprocessing.js was doing a lot of redundant iterations over the array of data as well as a lot of superfluous equality checks. So I re-wrote it to try to expose a slightly different style of programming that I know to be faster, believe to be more succinct, and also believe to be easier to maintain. There are still a lot of copies of arrays that are happening, but one thing at a time.

@jebeck this is a provisional PR, mostly to show a different style of code and see if you agree that it is an improvement. This should be done after #75 (I branched off of that). If you want to talk about the changes, lmk.