Nativo para :
for (var i = 0; i < posts.length; i++) {
var post = posts[i];
for (var j = 0; j < post.comments.length; j++) {
var comment = comments[j];
console.log(comment.body);
}
};
Native forEach (navegadores modernos)
posts.forEach(function(post) {
post.comments.forEach(function(comment) {
console.log(comment.body);
});
});
Sublinha cada um (Cross-Browser) :
_.each(posts, function(post) {
_.each(post.comments, function(comment){
console.log(comment.body);
});
});
** Suger each (Cross-Browser) **
http://sugarjs.com/api/Array/each
posts.each(function(post) {
post.comments.each(function(comment){
console.log(comment.body);
});
});
Eu sei que os loops for nativos são mais eficientes, mas para mim um código legível limpo tem precedência.
[Editar] Além disso, há o método forEach nativo do ECMAScript 5 para o qual _.each delega, mas não é compatível com o IE8. Sou um grande fã da biblioteca underscore.js, então ainda prefiro usar o método cross-browser _.each.
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach
Se quiser evitar o uso de underscore.js, você pode corrigir condicionalmente os navegadores mais antigos para dar suporte ao forEach com o seguinte (retirado do link acima):
if ( !Array.prototype.forEach ) {
Array.prototype.forEach = function(fn, scope) {
for(var i = 0, len = this.length; i < len; ++i) {
fn.call(scope || this, this[i], i, this);
}
}
}