76

IEnumerable.Any(Predicate<T>)在 JavaScript 或 jQuery 中是否有等价物?

我正在验证一个项目列表,如果检测到错误,我想尽早中断。我可以使用 来做到这一点$.each,但我需要使用外部标志来查看是否确实找到了该项目:

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

有什么更好的方法?我不喜欢for在 JavaScript 数组中使用纯文本,因为它会迭代所有成员,而不仅仅是值。

4

8 回答 8

109

这些天来,您实际上可以使用Array.prototype.some(在 ES5 中指定)来获得相同的效果:

array.some(function(item) {
    return notValid(item);
});
于 2014-05-02T01:58:57.557 回答
18

is您可以使用接受谓词的 jQuery 函数的变体:

$(array).is(function(index) {
    return notValid(this);
});
于 2011-05-10T13:19:46.160 回答
4

锡安的回答是正确的。扩展他的答案:

jQuery 的.is(function)行为与 .NET 的IEnumerable.Any(Predicate<T>).

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

根据表达式检查当前选择,如果选择的至少一个元素适合给定的表达式,则返回 true。

于 2011-07-21T17:33:15.620 回答
3

您应该使用普通for循环(不是for ... in),它只会循环遍历数组元素。

于 2011-05-10T13:17:00.413 回答
3

您可以使用 array.filter (IE 9+ 请参阅下面的链接以获取更多详细信息)

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

于 2016-09-05T14:55:58.747 回答
1

我建议您尝试 JavaScriptfor in循环。但是,请注意语法与使用 .net 获得的语法完全不同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);
}
于 2011-05-10T14:47:15.997 回答
1

死灵术。
如果你不能使用 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');
于 2021-08-23T16:16:46.687 回答
0

我建议你使用该$.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,请使用更新的解决方案!这个是出于历史目的,并作为旧需求的参考,也许有人在使用遗留代码时仍然觉得有用。
于 2011-05-10T13:30:21.863 回答