Hey Chris,
It's cool that you're researching the options yourself with an open mind. Best of luck whatever you decide.
To answer your question about the code snippet above, my first comment is that I agree with you. If it were mine, I'd rewrite it for clarity, probably pulling out some functions so that the piece you quote could be simplified to something like:
Code:
this.props.products.forEach(function(product) {
if (isFilteredOut(product) || notAvailable(product)) return;
if (product.category !== lastCategory)
rows.push(<ProductCategoryRow category={product.category} key={product.category} />);
rows.push(<ProductRow product={product} key={product.name} />);
lastCategory = product.category;
}.bind(this));
Even that's not great, because I'm not crazy about the lastCategory / currentCategory check thing going on. It feels procedural and clunky.
And on top of all that, you have the ugly JSX xml-y stuff going on. So at this point, you might be wondering why I would still be recommending this stuff...
To borrow an analogy from writing, think overall structure vs sentence level elegance. An essay could be well-structured and easy to follow, with clear arguments backed by orderly evidence, but nonetheless poorly written at the sentence level: too wordy, overly academic, etc. Conversely, a brilliant writer can produce something meandering, with no clear point and arguments without evidence, but gorgeous and entertaining at the sentence level.
I'd argue that the code in question is poor at the sentence level. And when Pete is making his claims about this code being easy to follow, he's talking about the system level.
The behavior of the system as a whole is incredibly simple. You have a data model. Events change the model. The view is guaranteed to reflect the model, and updates itself automatically. That's kind of all you have to know to understand a system built in this way. Everything else is details. And I'm willing to put up with ugliness and verbosity in those details to get the system level simplicity. Because complex system architecture is the real time sink. That's where you find the nastiest bugs.
I think I linked to this before, but for a specific example of the benefits of this approach watch the 15 minutes or so of this video, which starts around 10:15:
http://facebook.github.io/flux/docs/overview.html. She walks through refactoring a facebook feature from a more complex version of MVC into this style.