Tôi nghĩ điều đáng nói là cách _.each () của Underscore hoạt động bên trong. _.Each (list, iteratee) kiểm tra xem danh sách đã truyền là một đối tượng mảng hay một đối tượng.
Trong trường hợp danh sách là một mảng, các đối số lặp sẽ là một phần tử danh sách và chỉ mục như trong ví dụ sau:
var a = ['I', 'like', 'pancakes', 'a', 'lot', '.'];
_.each( a, function(v, k) { console.log( k + " " + v); });
0 I
1 like
2 pancakes
3 a
4 lot
5 .
Mặt khác, nếu đối số danh sách là một đối tượng, trình lặp sẽ lấy một phần tử danh sách và một khóa:
var o = {name: 'mike', lastname: 'doe', age: 21};
_.each( o, function(v, k) { console.log( k + " " + v); });
name mike
lastname doe
age 21
Để tham khảo, đây là mã _.each () từ Underscore.js 1.8.3
_.each = _.forEach = function(obj, iteratee, context) {
iteratee = optimizeCb(iteratee, context);
var i, length;
if (isArrayLike(obj)) {
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};