等效于 LINQAny()的 JavaScript/jQuery

在 JavaScript 或 jQuery 中是否有相当于 IEnumerable.Any(Predicate<T>)的代码?

我正在验证一个项目列表,并希望在检测到错误时及早中断。我可以使用 $.each来完成,但是我需要使用一个外部标志来查看这个项目是否真的被找到了:

var found = false;
$.each(array, function(i) {
if (notValid(array[i])) {
found = true;
}
return !found;
});

有什么更好的办法吗?我不喜欢对 JavaScript 数组使用简单的 for,因为它迭代所有的成员,而不仅仅是值。

33039 次浏览

您应该使用一个普通的 for循环(而不是 for ... in) ,它只会循环通过数组元素。

你可以使用 jQuery is函数的变体,它接受一个谓词:

$(array).is(function(index) {
return notValid(this);
});

我建议你使用 $.grep()方法,它非常接近于 IEnumerable.Any(Predicate<T>):

$.grep(array, function(n, i) {
return (n == 5);
});

这里给你一个工作样本: http://jsfiddle.net/ErickPetru/BYjcu/

2021年最新情况

这个答案是10多年前发布的,所以强调这一点很重要:

  1. 当它发布时,它是一个完全有意义的解决方案,因为当时没有任何 JavaScript 本地化的东西可以用一个函数调用来解决这个问题;
  2. 最初的问题有 jQuery 标记,因此不仅需要基于 jQuery 的答案,而且必须要有。投反对票根本说不通。
  3. 从那以后,JavaScript 世界发生了很大的变化,所以如果你没有被 jQuery 困住,请使用更新的解决方案!这里是出于历史目的,并作为旧需求的参考,也许有人在使用遗留代码时仍然觉得有用。

我建议您尝试 JavaScriptfor in循环。但是,请注意语法与使用。网址 IEnumerable。下面是一个小的说明性代码示例。

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(function)与.NET 的 IEnumerable.Any(Predicate<T>)具有相同的行为。

来自 http://docs.jquery.com/is:

根据表达式检查当前选定内容,如果选定内容中至少有一个元素符合给定表达式,则返回 true。

如今,你可以实际使用 Array.prototype.some(在 ES5中规定)来获得同样的效果:

array.some(function(item) {
return notValid(item);
});

您可以使用 array.filter (IE9 + 查看下面的链接了解更多细节)

[].filter(function(){ return true|false ;}).length > 0;

Https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/filter

巫师。
如果不能使用 array.some,可以在 TypeScript 中创建自己的函数:

interface selectorCallback_t<TSource>
{
(item: TSource): boolean;
}




function Any<TSource>(source: TSource[], predicate: selectorCallback_t<TSource> )
{
if (source == null)
throw new Error("ArgumentNullException: source");
if (predicate == null)
throw new Error("ArgumentNullException: predicate");


for (let i = 0; i < source.length; ++i)
{
if (predicate(source[i]))
return true;
}


return false;
} // End Function Any

也就是说

function Any(source, predicate)
{
if (source == null)
throw new Error("ArgumentNullException: source");
if (predicate == null)
throw new Error("ArgumentNullException: predicate");
for (var i = 0; i < source.length; ++i)
{
if (predicate(source[i]))
return true;
}
return false;
}

用法:

var names = ['Alice','Bob','Charlie','David'];
Any(names, x => x === 'Alice');