JavaScript检查元素内容是否包含数组的某些部分

9
我有一个像这样的数组
var ALLOW_SUBNET = ['192.168.1.', '192.168.2.', '192.168.3.' , '192.168.4.'];

我可以使用自己的函数获取PC客户端的IP地址:

getIPClient()
    var ipclient = input.getIPClient();

我的问题是如何检查客户端IP是否在我的允许子网内,我尝试使用indexOf()函数,但结果是错误的。 例如:
if IP Client is 192.168.1.115 => allow

if IP Client is 192.168.5.115 => deny.

1
indexOf() 不会起作用,因为它匹配整个字符串! - Pugazh
做相反的事情。对于此数组的每个元素,检查该元素是否在您的IP中。 - Ed de Almeida
在indexOf()函数中,你传递的是IP地址本身还是与子网分开的子网?如果你这样做,那么请把子网部分从IP中分离出来并尝试获取索引。因为ALLOW_SUBNET数组仅包含子网'192.168.1.' - Ashish Patel
@Pugazh 如果他删除客户端IP的最后一部分,indexOf()函数就能够工作。他只是检查子网是否相同,因此这样做是可行的。 - Lelio Faieta
4个回答

10
你可以使用 Array#some ,并检查 ALLOW_SUBNET 的一部分是否在 ip 的位置 0 内。

function check(ip) {
    return ALLOW_SUBNET.some(function (a) { return !ip.indexOf(a); });
}

var ALLOW_SUBNET = ['192.168.1.', '192.168.2.', '192.168.3.', '192.168.4.'];

console.log(check('192.168.1.115'));
console.log(check('192.168.5.115'));

使用String#startsWith的ES6

function check(ip) {
    return ALLOW_SUBNET.some(a => ip.startsWith(a));
}

var ALLOW_SUBNET = ['192.168.1.', '192.168.2.', '192.168.3.', '192.168.4.'];

console.log(check('192.168.1.115'));
console.log(check('192.168.5.115'));


你应该使用startsWith,而不是一些丑陋的索引检查(也请参见这里)。 - Bergi
对我来说看起来像是一个新功能。 - Nina Scholz
1
比“某些”更新,但也已经存在多年了 :-) - Bergi

5

这里有一个解决方案。

var ALLOW_SUBNET = ['192.168.1.', '192.168.2.', '192.168.3.', '192.168.4.'];

function checkIP(ip) {
  var allow = false;
  for (var i = 0; i <= ALLOW_SUBNET.length; i++) {
    if (ip.indexOf(ALLOW_SUBNET[i]) > -1) {
      allow = true;
      break;
    }
  }
  return allow;
}

console.log(checkIP('192.168.9.3'));

console.log(checkIP('192.168.1.3'));


不要在数组上使用for...in枚举! - Bergi
@Bergi:谢谢分享。我以后会避免使用它。 - Pugazh
1
@Bergi:回答已更新! - Pugazh

3
您可以尝试以下方法:

逻辑:

  • 您有一个公共部分 192.168,您可以使用正则表达式来处理。
  • 您的第三段可以是 1-4,您可以拥有一个允许的值列表。这将使您能够处理添加 65 仍然不允许的情况。
  • 您可以为最后一块设置范围值。

var ipRegex = /^192.168/
var ALLOW_SUBNET = [1, 2, 3, 4];
var ALLOW_ADDRESS = [95, 120]

var validIp = ["192.168.1.115", "192.168.2.96"];
var invalidIPs = ["192.167.1.115", "192.168.5.115", "192.168.1.90", "192.168.1.215"];

function validateIP(ip) {
  var parts = ip.split(".");
  return !(
    !ipRegex.test(ip) ||
    ALLOW_SUBNET.indexOf(+parts[2]) < 0 ||
    !(ALLOW_ADDRESS[0] <= +parts[3] && ALLOW_ADDRESS[1] >= +parts[3])
  )
}

validIp.forEach(function(ip) {
  console.log(ip, validateIP(ip));
})
invalidIPs.forEach(function(ip) {
  console.log(ip, validateIP(ip));
})


2
这样做可以完成任务:
allow_deny = function(ipclient) {
  var ALLOW_SUBNET = ['192.168.1.', '192.168.2.', '192.168.3.','192.168.4.'];
  var arr = ipclient.split('.');
  arr.pop();
  var testedip = arr.join('.') + '.';
  return ((ALLOW_SUBNET.indexOf(testedip) > -1) ? 'allow' : 'deny');
}

console.log(allow_deny('192.168.1.115'));
console.log(allow_deny('192.168.5.115'));

这将导致,检查您的控制台,出现如下内容:
> allow
> deny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接