相当于javascript或jquery中的.some()方法

Working equivalent for method .some() in javascript or jquery?

本文关键字:方法 some 中的 javascript jquery 相当于      更新时间:2023-09-26

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

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

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

但是会抛出错误:

"TypeError: 'undefined'不是一个函数"(例如:Safari 6.0.4)。


UPD: Error来自最后一行,是的,其中});。isNumber:

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

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

乌利希期刊指南:问题解决了。我在选择答案时有点困惑。@RobG实现.some()的代码对于初学者(和我)来说更容易理解,所以我改变了我的投票。

对于其他来到这个线程的人,您可以使用some()在jQuery对象上:

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

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


根据@alf-eaton的建议,您可以使用:

$(…).toArray().some(function(node) { … })

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

.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参数可能是多余的。

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

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

$(...).is(function)应该也可以。jQuery API文档声明(强调我的):

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

使用问题中的例子,我们会有这样的内容:

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

。在最基本的版本中,你可以创建一个"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.

。如果您想在jQuery对象中链接.some调用,您也可以将其添加为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上填充它,但我强烈建议不要直接修改内置原型。

香草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;
  });
}

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

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