Twitter API返回的ID是64位整数,例如276403573577891842。我想通过比较它们的ID来查看一个Tweet是否比另一个Tweet更新。

有没有一种比较两个64位整数的聪明方法,以查看仅支持32位整数的JavaScript中哪个更大?

最佳答案

假设API返回的字符串随后被解析为int,则有两种方法可以做到这一点-拆分方法和填充方法;

分裂。
这里的想法是将数据拆分为环境可以处理的大小。最大的32位数字是0xFFFFFFFF4294967295。现在4294967295..toString().length === 10。因此,所有str长度

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

10-06 01:35