处理编程挑战,在标准javascript中重新实现underscore.js的功能。具体来说,我正在努力实现_.some
功能。 (http://underscorejs.org/#some)
我正在努力的部分是它要求我在内部使用_.every
找到解决方法。 (http://underscorejs.org/#every)
我之前已经完成了_.every
功能,它可以正常工作。
逻辑上,我想在草绘代码中做些什么:
_.some = function(collection, truthStatementFunction) {
return !(_every(collection, !truthStatementFunction))
}
或者用英语翻转真值陈述以测试条件为假的位置......如果_.every
测试然后返回true ...那么我们知道_.some的原始真值陈述是假的(所以翻转_.every
的返回以获得_some
的正确回报。同样,如果_.every
返回false,则将其翻转以获得_.some
的正确返回值。
显然,这个草图的问题是!truthStatementFunction
部分。如何进入迭代器以更改函数的内部以翻转它?似乎函数的内部可以访问...
我是否完全咆哮错误的树,并且有更好的方法可以使用_.every
来解决这个问题?
答案 0 :(得分:9)
传递_every
一个返回truthStatementFunction
结果反转的函数:
_.some = function(collection, truthStatementFunction) {
return !(_every(collection, function(v) {
return !truthStatementFunction(v);
}));
}
回答问题的第二部分:
并且有更好的方法可以使用_.every来解决这个问题吗?
除了使用_.every
之外,肯定有更好的方法来解决这个问题。只需迭代集合,并在找到匹配的任何元素后立即返回true。在_.some
将返回true的情况下效率更高,因为您并不真正关心集合中有多少元素满足谓词,只要至少有一个。
_.some = function(c, pred) {
for(var i = 0; i < c.length; i++) {
if (pred(c[i])) return true;
}
return false;
}