Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript或jquery中的method.some()是否等效?_Javascript_Equivalent - Fatal编程技术网

javascript或jquery中的method.some()是否等效?

javascript或jquery中的method.some()是否等效?,javascript,equivalent,Javascript,Equivalent,正在寻找“javascript中的某个方法的等价物”和“如果在数组中,则只返回一个值”,但只看到了确定变量类型的方法的答案,或者看到了太多不必要的结果 我绕过html中的所有输入,我想要如下内容: $('#goodsFilter') .find('input[type="number"]') .some(function(i,el){ return (isNumber($(el).val())) ? 1 : 0; }); 但它抛出了一个错误: “TypeErro

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

我绕过html中的所有输入,我想要如下内容:

$('#goodsFilter')
    .find('input[type="number"]')
    .some(function(i,el){
        return (isNumber($(el).val())) ? 1 : 0;
});
但它抛出了一个错误:

“TypeError:‘undefined’不是函数”(如Safari 6.0.4)


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

function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
这应该检查每个输入信息是否存在,如果其中至少有一个不是空的,则返回1,否则返回0。 如何在大多数现代浏览器中替换它

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

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

$('#goodsFilter')
    .find('input[type="number"]')
    .filter(function(i,el){ return isNumber($(el).val())); })
    .length > 0
Array.prototype.some返回true或false,因此您可以执行以下操作:

.some(function(el){
        return !isNaN(el.value);
}
var result = $('#goodsFilter')
              .find('input[type="number"]')
              .some(function(el) {
                 return isNumber(el.value); 
              })? 1 : 0; 
你没有说错误是从哪里来的,是不是因为打了isNumber

编辑 啊,所以你的问题是一些

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

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

所以应该是这样的(注意jQuery.fn===jQuery.prototype):

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


以上仅进行了少量测试,可选的thisArg参数可能是多余的。

。在最基本的版本中,您只需创建一个“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.
。正如@RobG在评论中指出的,本机
Array.prototype.some
实现使用一组不同的参数调用回调。我正在跟踪OP的示例代码,但是您可以在循环中使用
if(f(this[I],I,this)){return true;}
模拟ECMA实现的参数


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

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

 $.makeArray($(...)).some(function(x) { ... })
jQuery.makeArray()
将jQuery对象转换为数组,因此可以对其使用
some()


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

$(…).toArray().some(函数(节点){…})
$(…).is(函数)
也应该可以工作。文件说明(重点):

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

因此,使用问题中的示例,我们可以得到如下结果:

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

用普通Javascript实现(带有箭头语法)


$(el.val()
el.value
更有效。
isNumber
函数的作用是什么?您可以使用
return!isNaN(el.值).some()
?为了completeness@Alexander-我猜它要么是内置的,要么是本机模拟。@RobG,好吧,如果是内置的,那么就错了,因为他是在jQuery方法之后链接它的-这是错误的naive@RobG,谢谢你的
el.value
是的,这个函数可以这样做:
函数isNumber(n){return!isNaN(parseFloat(n))&&isFinite(n);}
谢谢@xdazz的回答!但是为什么a应该使用.filter()`var n=$('#goodsFilter').find('input[type=“number”]).filter(函数(el){console.log(el);返回isNumber($(el.val());})。长度>0;console.log(n);`在“jquery.js”中显示“TypeError:“undefined”不是对象(计算'o.nodeName.toLowerCase')”。感谢您提出使用.length的想法!它对我来说很简单也很有用(:@RobG,.some()不起作用。完全对我来说(见帖子中的错误)。然后你需要一个“垫片”来提供它。你的问题只是说“它不起作用”,而没有说“它”是什么是。我在
标记中使用如下垫片:
,jquery和我的脚本–就在
之前。如何改进我的问题?如果有任何元素,此代码应返回1-number。否则为-0。尝试使用.some()…each()时,我会收到一个错误只返回数组元素,而不是一个布尔值。太好了,这正是我想要的!链接看起来更吸引人。为什么在
中使用
for?您了解JavaScript中的作用吗?另外,您正在创建一个隐式全局变量
l
。使用可能与其他jQuery回调更一致e> l.get(i)
而不是
l.eq(i)
,然后示例将使用
$(el.text()
@squint我不是一个真正的jQuery人,所以我在数组中使用了“for-in”(这根本没有问题)。很好地指出,这可能会导致jQuery对象和未声明的变量出现问题。我修复了这些问题,谢谢。@Paulpro我的想法是在循环中返回一个jQuery对象,这样用户就不必在每次迭代中再次调用
$()
。@Diegonnes不建议使用“shim”Array.prototype,已存在Array.prototype.some。上述问题:1)参数顺序与现有某些方法中的顺序相反2)现有某些方法返回true和false,而不是1和0 3)本机方法仅访问现有成员,上面假设一组从0到长度的连续成员4)没有分配点
l=this
,只需使用这个5)它更有效
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.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!'); });
 $.makeArray($(...)).some(function(x) { ... })
var result = $('#goodsFilter')
              .find('input[type="number"]')
              .is(function(idx, el) {
                  return isNumber(el.value); 
              })? 1 : 0; 
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;
  });
}