You could also make certain velocity ranges map to certain animation frames, so the animation will automatically match the jump arc whenever you tweak the jump velocity. And it will advance to the downward part if you collide with an overhead obstruction and start falling before the jump apex.
This is what I typically do. When the jump starts, you record the initial vertical velocity upward. While the player is moving upward, you do something like this:
animationFraction = (1.0 - (currentUpVelocity / initialUpVelocity)) * 0.5;
That gives you a value in the range [0 .. 0.5], for how far you should be through your animation, as your currentUpVelocity goes from "initialUpVelocity" to 0.
Once the player starts moving downward again, you have two options. Usually, you want to keep using the same general idea; as the up velocity reaches -initialUpVelocity, you reach the end of the animation, and hold there until the player hits the ground.
An alternate approach I've used on a few projects is to test how high the player is above the ground each frame while he's descending, and do some maths to figure out how long it would take for him to hit the ground, and update the animation fast enough so that it'll reach the end of the animation at the same time he hits the ground. That's often useful if you want your character to do a mid-air flip and just barely land on his feet as he touches the ground, even if he's been jumping off a cliff. Of course, it can lead to some weird animation discontinuities if the player moves over the edge of a cliff while descending (last frame he was 1000m from the ground and this frame he's only 5m from the ground.. or vice versa), so you have to be able to cope with those.