5

处理编程挑战以在标准 javascript 中重新实现 underscore.js 的功能。具体来说,我正在努力实现该_.some功能。( http://underscorejs.org/#some ) 我正在苦苦挣扎的部分是它要求我找到一种在_.every内部使用的方法来解决它。( http://underscorejs.org/#every )

我之前已经完成了这个_.every功能,它应该可以正常工作。

从逻辑上讲,这是我想要在草图代码中做的事情:

_.some = function(collection, truthStatementFunction) { 
  return !(_every(collection, !truthStatementFunction)) 
}

或者用英语,翻转真值语句来测试条件为假的地方......如果_.every测试返回真......那么我们知道_.一些原始真值语句是假的(所以翻转返回_.every得到的正确回报_some)。同样,如果_.every返回 false 然后翻转它以获得正确的返回 true for _.some

显然,这个草图的问题是!truthStatementFunction零件。如何进入该迭代器以更改函数的内部以翻转它?似乎无法访问该函数的内部...

我是不是完全找错了树,有没有更好的方法来解决这个问题_.every

4

1 回答 1

9

传递_every一个函数,该函数返回结果的反转truthStatementFunction

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) {
        return !truthStatementFunction(v);
    }));
}

要回答您问题的第二部分:

有没有更好的方法使用 _.every 来解决这个问题?

肯定有比使用更好的方法来解决这个问题_.every。只需遍历集合,并在找到任何匹配的元素后立即返回 true。在要返回 true的情况下效率更高_.some,因为您并不真正关心集合中有多少元素满足谓词,只要至少有一个。

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) {
        if (pred(c[i])) return true;
    }
    return false;
}
于 2013-08-10T00:10:28.830 回答