在javascript或jquery中使用等效的.some()方法?

tro*_*war 6 javascript equivalent

正在寻找"相当于javascript中的某些方法"和"只返回一个值,如果在数组中",但只看到了确定变量类型或太多不必要的方式的答案.

我绕过html中的所有输入,我想要这样的东西:

$('#goodsFilter')
    .find('input[type="number"]')
    .some(function(i,el){
        return (isNumber($(el).val())) ? 1 : 0;
});
Run Code Online (Sandbox Code Playgroud)

但它抛出一个错误:

"TypeError:'undefined'不是函数"(例如Safari 6.0.4).


UPD:错误来自最后一行,是的,在哪里});.ISNUMBER:

function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
Run Code Online (Sandbox Code Playgroud)

这应该检查每个输入信息的存在,并且,如果它们中的至少一个不为空,则返回1,否则为0.如何将其替换为在大多数现代浏览器中工作?

UPD: 问题解决了.我在选择答案时有点困惑.@RobG实现的代码.some()对初学者来说更容易理解(我也是),所以我改变了我的投票.

Ale*_*x D 8

对于参与此线程的任何其他人,您可以通过some()以下方式在jQuery对象上使用:

 $.makeArray($(...)).some(function(x) { ... })
Run Code Online (Sandbox Code Playgroud)

jQuery.makeArray()将jQuery对象转换为数组,以便您可以使用some()它.

  • 或者甚至更简单,使用[`toArray()`](https://api.jquery.com/toArray/):`$(...).toArray().some(function(node){...})` (9认同)

Rob*_*obG 7

Array.prototype.some返回true或false,因此您可以执行以下操作:

.some(function(el){
        return !isNaN(el.value);
}
Run Code Online (Sandbox Code Playgroud)

你没有说出错误的来源,是从调用isNumber吗?

编辑

啊,所以你的问题是有的.

如果你想有一个jQuery的一些方法,那么它至少应该模仿内置的ECMAScript 一些,这需要两个参数:一个回调函数和一个可选的这个说法.

回调函数应该有三个参数:值,索引(可选)和用作参数的可选值.它应该按升序访问数字成员,并且只访问实际存在的成员.

所以它应该是(注意jQuery.fn === jQuery.prototype):

jQuery.fn.some = function(fn, thisArg) {
  var result;

  for (var i=0, iLen = this.length; i<iLen; i++) {

    if (this.hasOwnProperty(i)) {

      if (typeof thisArg == 'undefined') {
        result = fn(this[i], i, this);

      } else {
        result = fn.call(thisArg, this[i], i, this);
      }

      if (result) return true;
    }  
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你现在想要,你可以这样做:

var result = $('#goodsFilter')
              .find('input[type="number"]')
              .some(function(el) {
                 return isNumber(el.value); 
              })? 1 : 0; 
Run Code Online (Sandbox Code Playgroud)

或者您可以执行以下任一操作以将true强制为1,将false强制为0:

var result = Number($('#goodsFilter')
              .find('input[type="number"]')
              .some(function(el) {
                 return isNumber(el.value); 
              }));
Run Code Online (Sandbox Code Playgroud)

要么

var result = +($('#goodsFilter')
              .find('input[type="number"]')
              .some(function(el) {
                 return isNumber(el.value); 
              }));
Run Code Online (Sandbox Code Playgroud)

以上只是经过轻微测试,可选的thisArg参数可能是多余的.


xda*_*azz 5

您可以使用该.filter方法,然后检查长度.

$('#goodsFilter')
    .find('input[type="number"]')
    .filter(function(i,el){ return isNumber($(el).val())); })
    .length > 0
Run Code Online (Sandbox Code Playgroud)