Twitter API返回64位整数的ID,例如276403573577891842.我想通过比较他们的ID来查看一个推文是否比另一个更新。
有没有一种聪明的方法来比较两个64位整数,看看哪个在JavaScript中更大,只支持32位整数?
答案 0 :(得分:3)
假设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)。
答案 1 :(得分:1)
执行文本<
或>
比较应该没有任何问题,如果它们确实是数字,其中最高的数字ID是最新的推文,最低的ID是最早的
答案 2 :(得分:1)
以下是我根据接受的答案使用的内容:
只需按照以下方式调用: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;
}
答案 3 :(得分:0)
如果所有其他方法都失败了,您可以随时将ID存储为字符串并将其拆分为两半,然后您可以将它们分别作为整数进行比较。