简体   繁体   English

Javascript - 用于检查数组元素上的 isInteger 的 every() 方法

[英]Javascript - every() method to check isInteger on array elements

I want to check return true if an array contains all integers or false if not.如果数组包含所有整数,我想检查返回 true,否则返回 false。 I am trying to use the every method MDN docs every .我正在尝试使用每个方法MDN docs every .

So if given '1234' it will return true and if given '123a' it would return false.因此,如果给定 '1234' 它将返回 true,如果给定 '123a' 它将返回 false。

  function validatePIN (pin) {
    pinArray = pin.split("");
      if (pinArray.length === 4 || pinArray.length === 6) {
        if (pinArray.every(Number.isInteger()) === true;) {
          return true
    }};

How does every pass the element to isInteger so it can test it?每个如何将元素传递给 isInteger 以便它可以测试它?

Even if you fix syntax error and pass Number.isInteger as a function this won't work.即使您修复语法错误并将Number.isInteger作为函数传递,这也不起作用。

 function wrongValidatePIN (pin) { var pinArray = pin.split(""); // <-- array of strings if (pinArray.length === 4 || pinArray.length === 6) { if (pinArray.every(Number.isInteger)) { // <-- isInteger works with numbers return true }} return false } console.log(wrongValidatePIN('1234'))

You need something like this你需要这样的东西

 function validatePIN (pin) { var pinArray = pin.split(""); // <-- array of strings return (pinArray.length === 4 || pinArray.length === 6) && pinArray.every(char => !Number.isNaN(Number.parseInt(char, 10))) } console.log(validatePIN('1234'), validatePIN('123a'))

Or you could use regexp或者你可以使用正则表达式

 function validatePin(pin) { return /^(\\d{4}|\\d{6})$/.test(pin) } console.log(validatePin('1234'), validatePin('123456'), validatePin('12345'), validatePin('123a'))

As the comments stated, the isInteger function can be passed as an argument by calling pinArray.every(Number.isInteger) instead of calling it a single time, (or by providing it inside a function .every(c=>Number.isInteger(c)) , but passing the function itself is more concise)正如评论所述, isInteger 函数可以通过调用pinArray.every(Number.isInteger)而不是一次调用来作为参数传递,(或通过在函数.every(c=>Number.isInteger(c)) ,但传递函数本身更简洁)

However, it's unlikely to provide the result you expect, because isInteger checks if the value is an actual integer, not if the value can be parsed to one.但是,它不太可能提供您期望的结果,因为isInteger检查该值是否为实际整数,而不是该值是否可以解析为 1。

That could be resolved with something like pinArray.map(parseFloat).every(Number.isInteger);可以通过像pinArray.map(parseFloat).every(Number.isInteger);类的东西来解决pinArray.map(parseFloat).every(Number.isInteger);

but then it would be easier to use !pinArray.some(isNaN)但是这样会更容易使用!pinArray.some(isNaN)

That could make the function:这可以使功能:

function validatePIN (pin) {
    return (pin.length === 4 || pin.length === 6) 
        && ![...pin].some(isNaN);
}

But as a final note, regular expressions are made for this type of check and could be preferable here但作为最后一点,正则表达式是为这种类型的检查而制作的,在这里可能更可取

Your pin.split("") will never work when you pass number eg.当您传递数字时,您的pin.split("")将永远不会工作,例如。 1234 as argument. 1234作为参数。 Convert to string first then split pin.toString().split("") .首先转换为字符串,然后拆分pin.toString().split("")

Now inside .every() function we cast our string to number by doing +number .现在在.every()函数中,我们通过执行+number将字符串转换为+number

return pinArray.every(number => Number.isInteger(+number));

.every() returns true or false. .every()返回真或假。

Here is working example.这是工作示例。

 function validatePIN(pin) { var pinArray = pin.toString().split(""); if (pinArray.length === 4 || pinArray.length === 6) { // returns true or false // +number casts string into number return pinArray.every(number => Number.isInteger(+number)); } // We assume that every PIN is not valid return false; }; console.log('test1', validatePIN(1234)); // true console.log('test2', validatePIN('1234')); // true console.log('test3', validatePIN('123a')); // false console.log('test4', validatePIN('0001')); // true

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM