我们在一些网站和微信公众号文章中都有看到过阅读时间,可以让读者更加方便地了解文章的长度。那么如何来实现这个功能呢?

如何计算阅读时间

一般来说,阅读时长和文章长度及阅读速度有关,文章内容和与读者水平都会影响阅读速度。但对于博客和公众号文章说,内容基本是以文字为主。所以,一个简单的计算公式:

阅读时间 = 字数 / 每分钟阅读的字数

JavaScript实现

/**
 * 从内容中提取汉字
 * @param content
 * @returns {*}
 */
function getChinese(content){
    //RegExpMatchArray | null
   return content.match(/[\u4E00-\u9FD5]/gu);
}

/**
 * 从内容中提取拉丁文单词
 * @param content
 * @returns {*}
 */
function getWords(content){
    // \u00C0-\u024F 是拉丁语增补字母,可能用于法语等语言
    // \u0400-\u04FF 是拉丁语增补字母,可能用于法语西里尔字母等语言,用于俄语
    // . @ / 添加以确保电子邮件和URL不被拆分
    // RegExpMatchArray | null
    return   content.match(/[\w\d\s\u00C0-\u024F\u0400-\u04FF.@/]+/giu);
}

/**
 * 计算内容字数
 * @param content
 * @returns {*}
 */
function getWordNumber(content) {
    return (getWords(content)?.reduce(
        (accumulator, word) =>
            accumulator + (word.trim() === "" ? 0 : word.trim().split(/\s+/u).length),
        0,
    ) || 0) + (getChinese(content)?.length || 0);
}

/**
 *计算阅读时间
 * @param content
 * @param wordsPerMinute
 * @returns {{minutes: number, words: *}}
 */
function getReadingTime (content,wordsPerMinute = 300) {
    const words = getWordNumber(content || "");
    return {
        minutes: Math.round((words / wordsPerMinute) * 100) / 100,
        words,
    };
}