7

正在寻找“等效于 javascript 中的某些方法”和“如果在数组中则只返回一个值”,但只看到了确定变量类型或太多不必要的方法的答案。

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

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

但它会抛出一个错误:

“TypeError:'undefined' 不是函数”(例如 Safari 6.0.4)。


UPD:错误来自最后一行,是的,在哪里});。是编号:

function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }

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

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

4

7 回答 7

9

对于来到这个线程的任何其他人,您可以通过some()这种方式在 jQuery 对象上使用:

 $.makeArray($(...)).some(function(x) { ... })

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


正如@alf-eaton 所建议的,您可以使用:

$(…).toArray().some(function(node) { … })
于 2013-07-18T21:41:32.320 回答
8

Array.prototype.some返回真或假,所以你可以这样做:

.some(function(el){
        return !isNaN(el.value);
}

您没有说错误来自哪里,是来自对isNumber的调用吗?

编辑

啊,所以你的问题是一些.

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

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

所以它应该是这样的(注意 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;
}

因此,如果您现在想要,您可以执行以下操作:

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

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

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

或者

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

以上只是简单测试,可选的thisArg参数可能是多余的。

于 2013-04-29T03:17:47.397 回答
5

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

$('#goodsFilter')
    .find('input[type="number"]')
    .filter(function(i,el){ return isNumber($(el).val())); })
    .length > 0
于 2013-04-29T03:01:12.437 回答
2

. . 在最基本的版本中,您可以只创建一个“some”函数:

function eSome(arr, f) { var i = 0, n = arr.length;
  for (;i<n;i++) { if (!i in arr) { continue }
    if (f(i, arr[i])) { return true; }
  } return false;
}

var list = [0, 1, 2, 3, 4, 5];
var testFunction = function (i, e) { return e === 2; };
console.log(eSome(list, testFunction));
//returns true and the loop ran only for the necessary three times.

. . 如果您想将.some调用链接到 jQuery 对象中,您也可以将其添加为 jQuery 函数,使用类似这样的内容(现已测试并已修复)示例:

jQuery.fn.some = function (f) { var i = 0, n = this.length;
  for (;i<n;i++) { if (!i in this) { continue }
    if (f(i, this[i])) { return true; }
  }
  return false;
}

$('.a').some(function (i, el) { return ($(el).text() == 'weeee!'); });

. . 正如@RobG 在评论中指出的那样,本机Array.prototype.some实现使用一组不同的参数调用您的回调。我正在关注 OP 的示例代码,但您可以if (f(this[i], i, this)) { return true; }在循环内部模仿 ECMA 实现的参数。

. . 您也可以在 上填充它Array.prototype.some,但我强烈建议不要对内置原型进行任何直接修改。

于 2013-04-29T04:05:37.993 回答
2

$(...).is(function)也应该工作。jQuery API文档状态(强调我的):

根据选择器、元素或 jQuery 对象检查当前匹配的元素集,如果这些元素中至少有一个与给定的参数匹配,则返回 true

因此,使用问题中的示例,我们将有如下内容:

var result = $('#goodsFilter')
              .find('input[type="number"]')
              .is(function(idx, el) {
                  return isNumber(el.value); 
              })? 1 : 0; 
于 2017-07-27T03:04:59.080 回答
0

Vanilla Javascript 中的实现(使用箭头语法)

function some(arr,callback){
  for(let i=0;i<arr.length;i++){
    if(callback(arr[i],i,arr)){
      return true;
    }
  }
  return false;
}

一些用途:

检查数组是否有偶数:

function hasEvenNum(arr){
  return arr.some(value=>{
    return value % 2 === 0;
  });
}
于 2019-06-09T20:26:24.493 回答
0

尝试使用[].prototype.call方法,第一个参数将是一个类似数组的值,第二个参数是一个将在每个元素上调用的函数。

[].some.call($('#goodsFilter').find('input[type="number"]'), function (el) {
    return isNumber($(el).val());
});
于 2021-06-23T17:01:46.573 回答