使用 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 地址排序?
有很多方法可以做到这一点,但我认为按由整个 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));
什么?是:
- 按点分割
- 将每个部分转换为数字
- 将每个部分转换为 base-16 字符串
- 确保每个部分都有两位数字
- 将它们全部缝起来,不用分隔符
现在键是像 "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"
}
]
我想知道是否有任何方法可以使用 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 地址排序?
有很多方法可以做到这一点,但我认为按由整个 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));
什么?是:
- 按点分割
- 将每个部分转换为数字
- 将每个部分转换为 base-16 字符串
- 确保每个部分都有两位数字
- 将它们全部缝起来,不用分隔符
现在键是像 "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"
}
]