为什么不按预期方式执行“某些”功能?

时间:2015-06-12 20:45:40

标签: javascript sails.js lodash

我正在尝试使用lodash 2.4.1以了解数组中是否至少有一个元素true作为其值

所以我决定使用lodash someany函数。

这就是我的代码:

if ( _.some([lineup.reachesMaxForeignPlayers(), lineup.reachesBudgetLimit()], true) ) {
  response.send(400, "La inclusión de este jugador no satisface las reglas del juego");
}

从不进入if块,即使第一个条件实际评估为true。

我得到了:

console.log(lineup.reachesMaxForeignPlayers());
console.log(lineup.reachesBudgetLimit());

if阻止之前,我实际上可以看到第一个语句评估为true

它会失败的是什么?

我使用lodash 2.4.1,因为它包含了Sails js依赖。

5 个答案:

答案 0 :(得分:3)

修改

实际上,只使用func getAssetThumbnail(asset: PHAsset) -> UIImage { var retimage = UIImage() println(retimage) let manager = PHImageManager.defaultManager() manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: nil, resultHandler: {(result, info)->Void in retimage = result }) println(retimage) return retimage } [docs]而没有谓词默认标识:

_.some

应该有用。

_.some(bool_arr) 
console.log(_.some([true, true, false]));
console.log(_.some([false, false, false]));

除了建议将<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script> 作为谓词传递的其他答案之外。您也可以使用:

Boolean
  

_.some(bool_arr, _.identity) [docs]

     

此方法返回提供给它的第一个参数。

答案 1 :(得分:2)

你应该使用一个函数:

function isTrue(v) {
  return v === true;
}

if ( _.some([lineup.reachesMaxForeignPlayers(), lineup.reachesBudgetLimit()], isTrue) ) {
  response.send(400, "La inclusión de este jugador no satisface las reglas del juego"); 
}

Lodash doc:https://lodash.com/docs#some

答案 2 :(得分:2)

我相信你的意思是传递Boolean作为谓词(第二个参数)

答案 3 :(得分:2)

当您将非函数值传递给some时,lodash会将其视为属性名称,并尝试查找包含名称给定的非虚假属性的对象。在您的示例中,您传递了true,因此它会尝试访问item1[true]item2[true]等。由于它们都不存在,因此结果为false。

解决方案是完全省略第二个参数,在这种情况下,默认为identity,即元素本身。

答案 4 :(得分:1)

_.some正在检查您提供的集合是否包含至少一个您所提供类型的对象的实例。观察:

> _.some([true, false], true)
false

> _.some([true, undefined], Boolean)
true

您可以改为传递一个函数:

> _.some([true, false], function(value) { return value === true; })
true

> _.some([undefined, false], function(value) { return value === true; })
false

但是,我建议使用if (lineup.reachesBudgetLimit() || lineup.reachesMaxForeignPlayers())