Twitter API 返回 64 位整数的 ID,例如 276403573577891842。我想通过比较它们的 ID 来查看一条推文是否比另一条推文更新。
有没有一种聪明的方法来比较两个 64 位整数,看看在仅支持 32 位整数的 JavaScript 中哪个更大?
Twitter API 返回 64 位整数的 ID,例如 276403573577891842。我想通过比较它们的 ID 来查看一条推文是否比另一条推文更新。
有没有一种聪明的方法来比较两个 64 位整数,看看在仅支持 32 位整数的 JavaScript 中哪个更大?
假设 API 返回字符串,然后将其解析为整数,有两种方法可以做到这一点 - 拆分方式和填充方式;
分裂。这里的想法是将数据拆分为环境可以处理的大小。最大的 32 位数字是0xFFFFFFFF
或4294967295
。现在4294967295..toString().length === 10
。所以所有 str 长度 <= 9 的 dec 都应该是 32 位安全的。
function compare(a,b){
var aa = [0,0,0], ba = [0,0,0], i = 3;
while (a.length) aa[--i] = parseInt(a.slice(-9)), a = a.slice(0,-9);
i = 3;
while (b.length) ba[--i] = parseInt(b.slice(-9)), b = b.slice(0,-9);
if (aa[0] === ba[0]){
if (aa[1] === ba[1]) {
if (aa[2] === ba[2]) return 0;
else if (aa[2] > ba[2]) return 1;
return -1;
} else if (aa[1] > ba[1]) return 1;
return -1;
} else if (aa[0] > ba[0]) return 1;
return -1;
}
// a > b: 1, a = b: 0, a < b: -1
垫。这次的想法是进行字符串比较,但要做到这一点,我们必须首先确保(字符串)数字具有相同的长度;即用0填充它们。这次'18446744073709551615'.length === 20
这么
function pad(str, len) { // Your fav. padding fn
var pre = '0';
len = len - str.length;
while (len > 0) {
if (len & 1) str = pre + str;
len >>= 1;
pre += pre;
}
return str;
};
a = pad('276403573577891842',20);
b = pad('50',20);
现在您可以a === b, a < b, a > b
正常使用了(除非您使用的是字符串而不是 int)。
如果它们确实是数字最高的数字 id 是最新的推文,而最低的 id 是最旧的推文,那么进行文本<
或比较应该没有任何问题>
这是我根据接受的答案使用的:
就这样称呼它:if( compare_64('124567891234567890', '>', '124567891234567891') )
function compare_64(a, type, b)
{
var result = false;
var pad_len = (a.length > b.length) ? a.length : b.length;
var aa = pad(a, pad_len);
var bb = pad(b, pad_len);
switch(type)
{
case '<':
result = (aa < bb) ? true : false;
break;
case '<=':
result = (aa <= bb) ? true : false;
break;
case '>':
result = (aa > bb) ? true : false;
break;
case '>=':
result = (aa >= bb) ? true : false;
break;
case '==':
result = (aa == bb) ? true : false;
break;
}
return result;
}
// Pad with zeros
function pad(str, len)
{
var pre = '0';
len = len - str.length;
while (len > 0)
{
if (len & 1) str = pre + str;
len >>= 1;
pre += pre;
}
return str;
}
如果一切都失败了,您始终可以将 ID 存储为字符串并将其分成两半,然后您可以将它们分别作为整数进行比较。