用jquery下划线地图

时间:2014-12-18 19:45:42

标签: jquery functional-programming underscore.js

我正在尝试使用underscorejs contribe(http://documentcloud.github.io/underscore-contrib/)和jQuery来构造对象。我的代码看起来像这样

1.  var rightMap = _.rcurry2(_.map);
2.  var tabKeys = ['tab1', 'tab2', 'tab3', 'tab4'],
3.      rootElements = _.pipeline(
4.                         rightMap(function(k){return '#' + k;}),
5.                         rightMap(function(k){return $(k);})  //Here is what confused me
6.                     )(tabKeys);
//expected result: [$('#tab1'), $('#tab2'), $('#tab3'),$('#tab4')];

此代码按预期工作。但是,我对第5行不满意。我想用

替换第5行
  rightmap($) 

这次尝试破坏了代码。只创建了$('#tab1')。我得到了

  [$('#tab1'), [], [],[]];
结果是

。我想知道这两段代码之间有什么区别。

感谢。

更新:我已添加指向我正在使用的库的链接。

更新:添加jsfiddle结果 http://jsfiddle.net/qbzuduom/1/是工作情况 http://jsfiddle.net/qbzuduom/2/是有问题的。

请在浏览器中按f12并查看控制台以查看差异。

代码中有什么不同?

更新:感谢@muistooshort的帮助,我能够生成所需的解决方案,并对jquery $函数有了更多的了解。 请查看http://jsfiddle.net/qbzuduom/6/以获取更新的演示

1 个答案:

答案 0 :(得分:1)

我认为您的问题是您误解了_.rcurry2的工作原理或_.map如何工作或两者都有效。

来自罚款_.rcurry2 manual

  

签名: _.rcurry2(func:Function)

     

返回fund的curried版本,其中从右到左处理最多两个参数。

这或多或少地修改了_.map的参数的处理方式,以便您可以说_.map(a, b)代替rightMap(b)(a)。请注意,_.rcurry2_.map调用其功能的方式无关。

然后是_.map we have

  

地图 _.map(list, iteratee, [context])

     

通过转换函数( iteratee )映射列表中的每个值,生成一个新的值数组。如果列表是JavaScript对象,则 iteratee 的参数将为(value, key, list)

_.map文档留下了一些非常重要的内容:它没有告诉你iteratee是一个数组时list个参数是什么,它只告诉你想要它们& #39;当list是一个对象时。当您_.map数组时,迭代器函数被称为:

iteratee(list[i], i, list)

请注意第二个论点,即所有问题的来源。

如果我们结合上述内容,我们会看到:

rightMap($)

与说法相同:

rightMap(function(k, i, list) { return $(k, i, list) })

$ function确实理解了多个参数,因此i将被视为"上下文":

Internally, selector context is implemented with the `.find()` method, so  `$( "span", this )` is equivalent to  `$( this ).find( "span" )`.

这给了我们:

rightMap(function(k, i, list) { return $(i).find(k) })

没有找到任何有用的东西。我猜测jQuery正在进行简单的if(context)检查,因此i === 0案例有效,因为0是假的。

在任何情况下,你都不能像这样通过$,你需要手动限制它获得的参数:

var oneDollar = function() { $(arguments[0]) }

rightMap(oneDollar)稍后:

var rootElements = _.pipeline(
    rightMap(function(k) { return '#' + k }),
    rightMap(oneDollar)
)(tabKeys);

演示:http://jsfiddle.net/ambiguous/f5uvaa4m/

$的第二个参数似乎并没有被广泛使用,所以我对你错过它并不感到惊讶。