JavaScript >> Javascript 文檔 >  >> JavaScript

在 JavaScript 中減少 64 位推文 ID

有些人可能知道,JavaScript 只有 能夠處理最大為 53 位的整數。這篇文章 Working with large integers in JavaScript(它是 Numbers 系列的一部分)很好地解釋了在 JS 中處理大數的一般概念。

64 位推文 ID 在 JS 中“四捨五入”

當我在 Storify 編輯器中重寫一些負責處理 Twitter 搜索的 JavaScript 代碼時,我不得不對這個主題進行一些研究:我們的結果中有重複的推文! Twitter官方文檔在這篇文章Working with Timelines中說:

如此真實,因為 idid_str Twitter API 響應中的字段不同。顯然,JavaScript 引擎只是“舍入”了不恰當的大數字。 :-( 任務很複雜,因為我需要從最後一條推文的 ID 中減去 1 以防止它在第二次搜索響應中再次出現。減法之後,我可以輕鬆地將值傳遞給 max_id Twitter API 的參數。

我遇到了不同的解決方案,但決定編寫自己的函數,該函數易於理解且不佔用大量資源。這是一個減少推文 ID 的腳本,它是 JavaScript 中的 64 位數字,無需庫或遞歸,可與 Twitter API 中的 max_id 或 since_id 一起使用:

function decStrNum (n) {
    n = n.toString();
    var result=n;
    var i=n.length-1;
    while (i>-1) {
      if (n[i]==="0") {
        result=result.substring(0,i)+"9"+result.substring(i+1);
        i --;
      }
      else {
        result=result.substring(0,i)+(parseInt(n[i],10)-1).toString()+result.substring(i+1);
        return result;
      }
    }
    return result;
}

要檢查它是否有效,您可以運行這些日誌:

console.log("290904187124985850");
console.log(decStrNum("290904187124985850"));
console.log("290904187124985851");
console.log(decStrNum("290904187124985851"));
console.log("290904187124985800");
console.log(decStrNum("290904187124985800"));
console.log("000000000000000001");
console.log(decStrNum("0000000000000000001"));

Bob Lauer 提出了我在 StackOverflow 問題中找到的替代解決方案,但它涉及遞歸,恕我直言更複雜:

function decrementHugeNumberBy1(n) {
    // make sure s is a string, as we can't do math on numbers over a certain size
    n = n.toString();
    var allButLast = n.substr(0, n.length - 1);
    var lastNumber = n.substr(n.length - 1);

    if (lastNumber === "0") {
        return decrementHugeNumberBy1(allButLast) + "9";
    }
    else {      
        var finalResult = allButLast + (parseInt(lastNumber, 10) - 1).toString();
        return trimLeft(finalResult, "0");
    }
}

function trimLeft(s, c) {
    var i = 0;
    while (i < s.length && s[i] === c) {
        i++;
    }

    return s.substring(i);
}

現在,如果你是那種喜歡用榴彈砲射麻雀的人 ,有成熟的庫來處理 JavaScript 中的大量操作;僅舉幾例:BigInteger、js-numbers 和 javascript-bignum。


Tutorial JavaScript 教程
  1. 將 JS 項目從 Travis 遷移到 GitHub Actions

  2. 上傳圖片在codeigniter 3中不起作用

  3. 這個前端倉庫中的所有內容是什麼?

  4. 一個無法拼寫的

  5. 跟我一起學習 React - 歡迎使用 React

  6. setState() 的異步特性

  7. 循環

  1. JavaScript 字符串長度屬性 |字符串的長度(字符數)

  2. Javascript Polyfills:forEach、map、filter 和 reduce

  3. 離子將變量傳遞到庫中以初始化 firebase

  4. 帶有 Ionic React 的貨幣選擇器和格式化程序

  5. 在 Jquery 中獲取數據屬性的值

  6. 了解 React Native 中的圖像組件

  7. 代碼和 Scrum 100 天的第 86 天:MySQL、Next.js 和構建網頁

  1. 如何檢查瀏覽器窗口是否在 Electron 的屏幕內

  2. 如何在沒有 Webpack 的 NodeJS 中導入文件

  3. F#s 均值

  4. 是前端、前端還是前端?