使用 crossfilter 对 ip 地址字段进行排序

Sorting on ip address fields using crossfilter

我想知道是否有任何方法可以使用 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)

它执行字符串排序和 return。

输出: 200.22.126.1,20.22.126.1,20.102.126.1,100.22.126.1,10.22.126.1,10.102.126.6,10102.126.5,10102.126.5,10102.126.4,10126.4,10102.126.3,10102.3,10102.3,10102.3,10102.3,1010.102.3,1010.10.102.3,1010。 126.2 , 10.102.126.1

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

Fiddle link

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

因为 JavaScript 没有真正的整数(只有浮点数),我们改为按数字的零填充十六进制表示形式排序。 It should be safe to deal with numbers up to 2^53,但我觉得这很冒险。字符串更直接。

请注意,您可以应用任何想要生成维度键的转换,因此即使像这样疯狂的操作也应该有效:

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

什么?是:

  1. 按点分割
  2. 将每个部分转换为数字
  3. 将每个部分转换为 base-16 字符串
  4. 确保每个部分都有两位数字
  5. 将它们全部缝起来,不用分隔符

现在键是像 "02167e01" 这样的字符串,crossfilter 将对它们进行正确排序(.top() 从最高到最低排序):

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

Demo fiddle.