与LINQ Any()等价的JavaScript/jQuery
JavaScript或jQuery中是否存在与IEnumerable.Any(谓词)等价的东西 我正在验证项目列表,如果检测到错误,我希望提前中断。我可以使用与LINQ Any()等价的JavaScript/jQuery,javascript,jquery,foreach,ienumerable,any,Javascript,Jquery,Foreach,Ienumerable,Any,JavaScript或jQuery中是否存在与IEnumerable.Any(谓词)等价的东西 我正在验证项目列表,如果检测到错误,我希望提前中断。我可以使用$进行操作。每个,但我需要使用外部标志来查看是否实际找到了该项目: var found = false; $.each(array, function(i) { if (notValid(array[i])) { found = true; } return !found; }); 有什么更好的办法
$进行操作。每个,但我需要使用外部标志来查看是否实际找到了该项目:
var found = false;
$.each(array, function(i) {
if (notValid(array[i])) {
found = true;
}
return !found;
});
有什么更好的办法?我不喜欢在JavaScript数组中使用普通的for
,因为它会迭代它的所有成员,而不仅仅是值。你应该使用普通的for
循环(而不是for…in
),它只会循环数组元素。你可以使用jQuery函数的变体,它接受一个谓词:
$(array).is(function(index) {
return notValid(this);
});
我建议您使用$.grep()
方法。它非常接近于IEnumerable.Any(谓词)
:
这里有一个工作示例:。我建议您尝试JavaScriptfor in
循环。但是,请注意,该语法与使用.netIEnumerable
时得到的语法大不相同。下面是一个小的说明性代码示例
var names = ['Alice','Bob','Charlie','David'];
for (x in names)
{
var name = names[x];
alert('Hello, ' + name);
}
var cards = { HoleCard: 'Ace of Spades', VisibleCard='Five of Hearts' };
for (x in cards)
{
var position = x;
var card = card[x];
alert('I have a card: ' + position + ': ' + card);
}
熊的回答是正确的。进一步阐述他的回答:
jQuery的.is(函数)
与.NET的IEnumerable.Any(谓词)
具有相同的行为
发件人:
根据表达式检查当前选择,如果选择中至少有一个元素符合给定表达式,则返回true
现在,您实际上可以使用(ES5中的规范)来获得相同的效果:
array.some(function(item) {
return notValid(item);
});
您可以使用array.filter(如需更多详细信息,请参阅下面的链接)
我相信OP想用普通的for
(…)迭代它的所有成员,在中使用for有时可以(如果数组.prototype
被扩展,或者如果你隐式地调整数组的大小)。实际上,$.grep()
更像FindAll(谓词)
@Groo:我没有说过(谓词)
是最接近grep()
的方法,只是非常接近。我同意FindAll(谓词)
更接近它。但两者都很接近。*可能(我想你是说)@Simon_Weaver:不;他不应该使用for in
来迭代数组。@SLaks,你误解了Simon_Weaver的评论!“你可以使用一个普通的for循环。”而不是“你应该…”我认为当用于数组时,你应该避免在is
函数中使用this
。因为你不会得到原始类型(因此使用“==”进行比较将失败)。我会使用数组[I]
来代替。看到这一点:这很有趣(my)但我的直觉反应是避免这种方法,因为它在一个不是jQuery选择(本机数组)的集合上运行选择函数$.fn.is
。如果有像$.is
这样的实用函数,我会觉得更安全,但这似乎是一个未记录的“特性”,因为jQuery选择是本机数组(或者至少他们使用了Array.prototype
),可能有足够多的代码依赖它,它永远不会改变。这句话,这个答案已经有六年历史了。现在你应该使用附近显示的本机ES5方法,或者类似于LoDash/underline/等。它有专门用于处理本机JS数组的API。你是对的,我没有注意到t上的日期他的回答。对此很抱歉(现在我无法撤消我的否决票!)快速总结:some()
对数组中的每个元素执行回调函数一次,直到找到回调返回真值的元素。如果找到这样的元素,some()
立即返回真值。否则,some()
返回false。如果您可以使用它,这是正确的答案。如果您需要IE8兼容性,那么这不是一个选项。更新:在ES6/ECMAScript 2015中,您可以执行myArray.some(c=>c)
来精确模拟Linq对.Any()的操作。注意,在Linq中.Any()方法不需要委托,而.some()需要委托。尝试在没有委托的情况下调用.some()将导致错误,因为委托将未定义。
array.some(function(item) {
return notValid(item);
});
[].filter(function(){ return true|false ;}).length > 0;