使用下划线功能进行澄清

时间:2014-10-28 00:17:16

标签: javascript underscore.js

我正在通过重写一些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; }

我只有一个。我在这个下划线功能中遗漏了什么吗?我是否正确地重写了它?

1 个答案:

答案 0 :(得分:0)

让我们来看看源代码,不管吗?

UnderscoreJS:_.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
};