ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงการทำงานของขีดล่าง _.each () ภายใน _.each (list, iteratee) ตรวจสอบว่ารายการที่ส่งผ่านเป็นออบเจ็กต์อาร์เรย์หรือออบเจ็กต์
ในกรณีที่รายการเป็นอาร์เรย์อาร์กิวเมนต์ iteratee จะเป็นองค์ประกอบรายการและดัชนีดังตัวอย่างต่อไปนี้:
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 .
ในทางกลับกันหากอาร์กิวเมนต์รายการเป็นอ็อบเจ็กต์ iteratee จะรับองค์ประกอบรายการและคีย์:
var o = {name: 'mike', lastname: 'doe', age: 21};
_.each( o, function(v, k) { console.log( k + " " + v); });
name mike
lastname doe
age 21
สำหรับการอ้างอิงนี่คือรหัส _.each () จาก 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;
};