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

时间:2013-08-10 00:04:01

标签: 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)) 
}

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

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

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

1 个答案:

答案 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;
}