我正在尝试使用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/以获取更新的演示
答案 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/
$
的第二个参数似乎并没有被广泛使用,所以我对你错过它并不感到惊讶。