Jquery中的prototype.any等价于什么?

15

在Prototype中,我们有一个名为.any的函数。我希望与Jquery中的相同。

我的Prototype代码是:

 if (item_name == '' || $R(1,ind).any(function(i){return($F("bill_details_"+i+"_narration") == item_name)})) {
     alert("This item already added.");
 }

我希望能够使用jQuery执行等效功能。

请帮助我实现所需的输出。谢谢您的帮助。


1
如果有人给你的帖子点了踩,请留言说明原因。 - Can Can
ind$F里面是什么? - jantimon
ind是一个数字,表示总行数。1、2、... - Can Can
$(1,ind) with ind = 5 不会生成数组 [1,2,3,4,5],而是生成 [1,5]。 - Christophe Debove
@ChristopheDebove $R(1,5) 将创建一个数组 [1,2,3,4,5]。 - Can Can
显示剩余5条评论
5个回答

23

对于IE 9+,它是内置的:

some() 方法测试数组中是否有元素通过由提供的函数实现的测试。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

[2, 4, 6, 8, 10].some(function(n) { return n > 5; });
// -> true (the iterator will return true on 6)

对于IE 8及以下版本:

Prototype any

[2, 4, 6, 8, 10].any(function(n) { return n > 5; });
// -> true (the iterator will return true on 6)
你可以使用 jQuery.grep:
jQuery.grep([2, 4, 6, 8, 10], function(n) { return n > 5; }).length > 0;
// -> true (as grep returns [6, 8, 10])

Underscore _.any_.some

_.any([2, 4, 6, 8, 10], function(n) { return n > 5; });
// -> true (the iterator will return true on 6)

你能为我上面的原型代码发布相应的jQuery代码吗? - Can Can
$F仍在使用Prototype,而不是jQuery。 - Alnitak
4
就性能而言,请注意,.any 应该在找到第一个匹配项后停止搜索,而 .grep 则会遍历整个数组。 - Uri
我想知道你是否可以使用类似于https://dev59.com/03A75IYBdhLWcg3wYH3I#22268145的东西来打破聚合函数非短路版本的限制。 - CMCDragonkai
对于 jQuery,$.grep().length 不如 $.is() 高效。 - Spongman

5
ES5有一个内置函数叫做Array.prototype.some,它测试数组中是否有任何元素匹配谓词函数,并在找到匹配元素后停止迭代。
.some(function(el) {
    return el.value === item_name;
});

你的问题现在就变成了创建所需元素数组的问题,这比在Prototype中更困难,因为jQuery中没有“range”运算符。幸运的是,$.map可以迭代空元素,即使内置的Array.prototype.map不能,所以你可以使用new Array(ind)
var found = $.map(new Array(ind), function(_, x) {
    return "bill_details_" + (x + 1) + "_narration";
}).some(function(id) {
    var el = document.getElementById(id);
    return el && (el.value === item_name);
});

上面的链接包含一个 .some 的 shim,用于旧版浏览器。

3

JQuery有一个.is()方法,从文档中可以看到:检查当前匹配的元素集合是否与选择器、元素或jQuery对象相匹配,并且如果至少有一个元素与给定的参数匹配,则返回*true*。因此,一个等效的代码是:

 if (item_name == '' || $([1,ind]).is(function(i) { return $('#bill_details_'+i+'_narration').attr('name') == item_name; })) {
      alert("This item already added.");
 }

0
根据JQuery的文档,如果在回调函数中返回false,则会中断循环:

我们可以通过使回调函数返回false来在特定迭代中断$.each()循环。返回非false与for循环中的continue语句相同;它将立即跳过下一次迭代。

摘自:http://api.jquery.com/jquery.each/


0
似乎http://api.jquery.com/jQuery.grep/是您正在寻找的。 尝试。
if (item_name == '' || $.grep([1,ind],function(i){return($("#bill_details_"+i+"_narration").attr("name") == item_name)}).length>0) {
     alert("This item already added.");
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接