如何使用_.every解决_.some?

jjj*_*jjj 5 javascript underscore.js

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

我已经完成了_.every早期的功能,它可以正常工作.

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

_.some = function(collection, truthStatementFunction) { 
  return !(_every(collection, !truthStatementFunction)) 
}
Run Code Online (Sandbox Code Playgroud)

或者在英语中,翻转真值陈述以测试条件为假的位置......如果_.every测试然后返回true ...那么我们知道_.some的原始真值陈述是假的(所以翻转返回_.every得到正确的回报_some).同样,如果_.every返回false,则将其翻转以获得正确的true返回值_.some.

显然,这个草图的问题是这个!truthStatementFunction部分.如何进入迭代器以更改函数的内部以翻转它?似乎没有功能的内部可访问...

我是否完全咆哮错误的树,有更好的方法来解决这个问题_.every吗?

Asa*_*din 9

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

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) {
        return !truthStatementFunction(v);
    }));
}
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法来解决这个问题_.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;
}
Run Code Online (Sandbox Code Playgroud)