【问题标题】:javascript check if an element content some part of an arrayjavascript 检查元素是否包含数组的某些部分
【发布时间】:2017-01-08 22:33:11
【问题描述】:

我有一个这样的数组

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.

【问题讨论】:

  • indexOf() 将不起作用,因为它匹配整个字符串!
  • 反其道而行之。对于此数组的每个元素,检查该元素是否在您的 IP 中。
  • 在 indexOf() 中,您传递与 IP 分离的子网或它自己的 ip 地址?..如果这样做,则将子网部分与 ip 分离并尝试获取索引。因为 ALLOW_SUBNET 数组只包含子网 '192.168.1.'
  • @Pugazh indexOf() 如果他删除了客户端 IP 的最后一部分,则可以工作。他只是检查子网是否相同,所以它可以工作。

标签: javascript arrays search


【解决方案1】:

您可以使用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'));

ES6 与 String#startsWith

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而不是一些丑陋的索引检查(另见here)。
  • 对我来说似乎是一个新功能。
  • 肯定比some 更新,但它也已经存在多年了:-)
【解决方案2】:

这里有一个解决方案。

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'));

【讨论】:

【解决方案3】:

你可以试试这样的:

逻辑:

  • 你有一个共同的部分192.168。您可以使用正则表达式。
  • 你的第三个区块可以有1-4。您可以拥有一个允许值的列表。当您希望添加 6 而仍然不允许添加 5 时,这将允许您处理案例。
  • 您可以为最后一个块设置范围值。

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

【讨论】:

    【解决方案4】:

    这样就可以完成工作了:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2018-06-15
      • 2022-01-02
      相关资源
      最近更新 更多