【问题标题】:Filter JSON using IP Address Range (JavaScript)使用 IP 地址范围 (JavaScript) 过滤 JSON
【发布时间】:2019-03-25 05:43:06
【问题描述】:

我有一个 JSON 文件,其中每个 JSON 对象都有一个唯一标识符(IP 地址

当给定 IP 地址范围时,我想根据给定范围过滤原始 JSON 并将其存储在一个新文件中。 (即所有 JSON 对象的 IP 地址都在给定范围内)

JSON 文件:

[{
    "Name": "SERVER1",
    "ipv4Address": "192.168.0.50",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER2",
    "ipv4Address": "192.168.0.51",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER3",
    "ipv4Address": "192.168.0.52",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER4",
    "ipv4Address": "192.168.0.53",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER5",
    "ipv4Address": "192.168.0.54",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
}]

如果给定范围是 192.168.0.52 - 192.168.0.54,则输出应为:

 [{
    "Name": "SERVER3",
    "ipv4Address": "192.168.0.52",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER4",
    "ipv4Address": "192.168.0.53",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER5",
    "ipv4Address": "192.168.0.54",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
}]

【问题讨论】:

  • 对于初学者来说,学习如何过滤数组是一个简单的网络搜索。请展示您尝试过的内容。然后你还没有提到你将在哪里运行这个代码......在浏览器或服务器上。您不能使用客户端代码写入文件

标签: javascript json search filter ip-address


【解决方案1】:

使用下面的代码 sn-p。

function isWithinRange(ip, lowerBound, upperBound) {

  // Put all IPs into one array for iterating and split all into their own 
  // array of segments
  var ips = [ip.split('.'), lowerBound.split('.'), upperBound.split('.')];

  // Convert all IPs to ints
  for(var i = 0; i < ips.length; i++) {

    // Typecast all segments of all ips to ints
    for(var j = 0; j < ips[i].length; j++) {
      ips[i][j] = parseInt(ips[i][j]);
    }

    // Bit shift each segment to make it easier to compare
    ips[i] = 
      (ips[i][0] << 24) + 
      (ips[i][1] << 16) + 
      (ips[i][2] << 8) + 
      (ips[i][3]);
  }

  // Do comparisons
  if(ips[0] >= ips[1] && ips[0] <= ips[2]) return true;

  return false;
}


var json = [{
    "Name": "SERVER1",
    "ipv4Address": "192.168.0.50",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER2",
    "ipv4Address": "192.168.0.51",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER3",
    "ipv4Address": "192.168.0.52",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER4",
    "ipv4Address": "192.168.0.53",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
},
{
    "Name": "SERVER5",
    "ipv4Address": "192.168.0.54",
    "OperatingSystem": [],
    "OperatingSystemServicePack": null,
    "OperatingSystemVersion": "6.3 (9600)"
}];


var newArr = [];
var lowerBound = '192.168.0.52';
var upperBound = '192.168.0.54';

json.forEach(function(item){
      var isInRange = isWithinRange(item.ipv4Address, lowerBound, upperBound);
      if(isInRange){ 
        newArr.push(item);
      }
});


console.log("new Array : ", newArr);

我使用@SaltedBlowfish 提供的解决方案,使用他的Bit Shifting 公式

参考:https://stackoverflow.com/a/29173281/4882013

【讨论】:

  • 谢谢,帮了大忙。
猜你喜欢
  • 2023-03-27
  • 2019-08-30
  • 2022-07-22
  • 1970-01-01
  • 2020-10-07
  • 2017-11-27
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多