实现以下目标的最佳方法是什么(通过将排除的数字传递给IndexOf来确保数字只有某些数字)?
function notInArray(num, arr){
var numStr = num.toString();
for (var i = 0, l = arr.length; i<l; i++){
if (numStr.indexOf(arr[i]) > -1 ) return false;
}
return true;
}
console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0])); //false
答案 0 :(得分:0)
如何使用RegEx?
function notInArray(num, arr)
{
return !(new RegExp(arr.join("|"), "g").test(num));
}
console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0]));
如此分解,它的作用:
num = 333331
arr = [1, 2, 4, 6, 7, 8, 9, 0]
arr.join("|")
= "1|2|4|6|7|8|9|0"
new RegExp(arr.join("|"), "g")
= /1|2|4|6|7|8|9|0/g
new RegExp(arr.join("|"), "g").test(num)
= /1|2|4|6|7|8|9|0/g.test(num)
基本上检查数字如果是,则表示true
,然后将其反转并返回。
答案 1 :(得分:0)
如果您只处理数字,则可以使用位掩码,这样num
的每个数字的检查都是在恒定时间内完成的
function notInArray(num, arr) {
var mask = 0
var i, l
for (i = 0, l = arr.length; i < l; i += 1) {
mask |= (1 << arr[i])
}
var numStr = num.toString();
for (i = 0, l = numStr.length; i < l; i += 1) {
var bit = 1 << Number(numStr[i])
if (mask & bit) return false
}
return true;
}
console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0])) //false
答案 2 :(得分:0)
结合我的方法和@Mauricio Poppe优秀的位掩码理念:
/**
* Check if the given number does not contain any of the specified digits.
*
* @param number Integer number in [0-Number.MAX_SAFE_INTEGER]
* @param digits Array of accepted digits in [0-9]
*/
function checkDigits(number, digits) {
var mask = 0, i, l;
for (i = 0, l = digits.length; i < l; ++i) {
mask |= (1 << digits[i]);
}
while (number > 9) {
l = number % 10;
if (mask & (1 << l)) return false;
number *= 0.1;
}
return !(mask & (1 << number));
}
console.log(checkDigits(333331, [1, 2, 4, 6, 7, 8, 9, 0])); // False
console.log(checkDigits(0, [0])); // False
console.log(checkDigits(9007199254740991, [1, 2, 3])); // False
console.log(checkDigits(0, [1])); // True
console.log(checkDigits(135, [2, 4, 6])); // True
console.log(checkDigits(9007199254740991, [3, 6, 8])); // True
请记住:{01}从01 === 1返回true。
答案 3 :(得分:0)
如果你像我一样认为,为了获得数字的个别数字,将其转换为字符串并不是一种侠义态度,那么你可能会发现自己正在编写一个递归代码。再说一遍,问“什么是最好的方式......”是什么意思?以下情况可能会变慢但对我来说就像是诗。
var getResult = $resource('api/:path/:method/:id',{path:'@api'}, {
query: {method:'GET', params: {method:'get'}, isArray:true },
好吧,这是我对弦乐社会的贡献。我首先构造一个lut(哈希表),然后应用var n = 333331,
a = [1, 2, 4, 6, 7, 8, 9, 0],
nina = (n,a) => !~a.indexOf(~~(n%10)) && (n < 10 || nina(n/10,a));
console.log(nina(n,a));
Array.prototype.some()