使用交叉过滤器对IP地址字段进行排序

时间:2018-06-20 16:02:22

标签: sorting ip-address crossfilter

我想知道是否可以使用交叉过滤器对ipaddress进行排序?

例如: 我有一组IP:

  [{ ip: "10.102.126.1"},{ ip: "10.102.126.2"},{ ip: "10.102.126.3"},{ ip: "10.102.126.4"},{ ip: "10.102.126.5"},{ ip: "10.102.126.6"},{ ip: "10.22.126.1"},{ ip: "20.102.126.1"},{ ip: "20.22.126.1"},{ ip: "100.22.126.1"},{ ip: "200.22.126.1"}]

当我应用交叉过滤器并使用时:

  

dimension.top(Infinity)

它对字符串进行排序并返回。

输出: 200.22.126.1,20.22.126.1,20.102.126.1,100.22.126.1,10.22.126.1,10.102.126.6,10.102.126.5,10.102.126.4,10.102.126.3,10.102.126.2,10.102。 126.1

现在在这里如何执行IP地址排序?

Fiddle link

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但是我认为用一个由整个IP地址组成的数字进行排序最简单。

由于JavaScript实际上没有整数(只有浮点数),因此让我们按数字的零填充十六进制表示进行排序。 It should be safe to deal with numbers up to 2^53,但对我来说有点冒险。字符串更简单。

请注意,您可以应用任何要生成尺寸键的转换,因此,即使是这样的疯狂操作也应起作用:

display

什么?是的:

  1. 由点分隔
  2. 将每个部分转换为数字
  3. 将每个部分转换为以16为底的字符串
  4. 确保每个部分都有两位数字
  5. 将它们缝在一起,没有分隔符

现在,键是像block这样的字符串,crossfilter可以正确地对其进行排序(function ip_to_hex(s) { return s.split('.').map(i=>(+i).toString(16).padStart(2, '0')).join(''); } var cf = crossfilter(data), dim = cf.dimension(d => ip_to_hex(d.ip)); 从最高到最低排序):

"02167e01"

Demo fiddle.