我正在通过重写一些Underscore函数来练习JavaScript。我对underscorejs.org上的集合示例感到有些困惑,其中包含以下内容:
地图
_.map(list, iteratee, [context])
别名:收集通过转换函数( iteratee )映射列表中的每个值,生成一个新的值数组。如果列表是JavaScript对象, iteratee 的参数将为
(value, key, list)
。_.map([1, 2, 3], function(num){ return num * 3; }); => [3, 6, 9] _.map({one: 1, two: 2, three: 3}, function(num, key) { return num * 3; }); => [3, 6, 9]
我重写了这个函数:
var map = function(list, func){
var newArr = [];
for(prop in list){
newArr.push(func(list[prop]));
}
return newArr;
};
我对第二个例子感到困惑,他们使用一个对象作为输入。我会把他们的例子写成
map({ one: 1, two: 2, three: 3 }, function(num) { return num * 3; })
但为什么他们的回调函数中有两个参数:
function(num, key){ return num * 3; }
我只有一个。我在这个下划线功能中遗漏了什么吗?我是否正确地重写了它?
答案 0 :(得分:0)
让我们来看看源代码,不管吗?
_.map()
_.map = _.collect = function (obj, iteratee, context) {
if (obj == null)
return [];
iteratee = _.iteratee(iteratee, context);
var keys = obj.length !== +obj.length && _.keys(obj), // Get the Object keys
length = (keys || obj).length, // Get the keys' length
results = Array(length), // Array to store results
currentKey; // Keep ref to current key
for (var index = 0; index < length; index++) { // Loop from 0 -> key.length
currentKey = keys ? keys[index] : index; // Objects use keys[index]
results[index] = iteratee(
obj[currentKey], // Value of object key
currentKey, // The current key
obj); // Object argument
}
return results; // Return the arr of results
};