【问题标题】:What is the most 'pure JavaScript' way to write my function, to reduce the execution time?编写函数以减少执行时间的最“纯 JavaScript”方式是什么?
【发布时间】:2018-03-18 10:22:08
【问题描述】:
var AcceptLngs = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pt-BR'],
    _getI18N = { 
        'wordToTranslate' : {
            'pt' : `translatedWord`,
            [...]
        },
        '2ndWordToTranslate' : {
            'pt-BR' : `translatedWord`,
            [...]
         }
    },
    nav = window.navigator,
    navLng = nav.language || nav.browserLanguage || nav.userLanguage,
    prefs = nav.languages,
    navPrefLng = prefs[0],
    defaultLng = 'en',
    lng = navLng, //It must be set for translation

    // CHECK THE LANGUAGE OF THE NAVIGATOR.
    checkLng = function checkLng() {
        // isL10nAvailable:
        if (AcceptLngs.indexOf(navPrefLng) < -1) {
            lng = navPrefLng;
            return lng;
        }
    },
    // SEARCH IF LANGUAGE OF THE APP IS AVAILABLE.
    isLngDispo = function isLngDispo() {
        // isSubstrL10nAvailable:
        checkLng();
        if (AcceptLngs.indexOf(navPrefLng) === -1) {
            lng = navPrefLng.substring(0,2);
            return lng;
        }
    },
    // SEARCH IF LANGUAGE OF THE APP IS AVAILABLE.
    setLng = function setLng() {
        // isL10nNoAvailable:
        isLngDispo();
        if (AcceptLngs.indexOf(lng) === -1) {
            lng = defaultLng;
            return lng;
        }
    };
    // APPLYING LANGUAGE FOR THE APP.
    setLng();

我是 JavaScript 的初学者。我的脚本有效。问题是它的执行时间。我从 102 毫秒(没有翻译)到 448 毫秒(有)。

我尝试了循环,但我没有设法让它正常工作。他没有检测到AcceptedLng 中的语言,并自动将nav.language 放入我。

也许,更简单的说,我应该直接在'_getI18N'中搜索,但是我还没有熟悉在数组中搜索,也无法得到任何结果。

信息:为了翻译,我在脚本中使用了 _getI18N[wordToTranslate][lng]。

【问题讨论】:

  • 您是否尝试过调试代码的哪一部分消耗了多少时间来进一步缩小您的问题范围?
  • 问题似乎来了(显然)setLng() 调用了一个本身调用另一个函数的函数。我的循环测试并没有花费太多时间,但只返回给我nav.langue。我尝试搜索数组并没有花费我太长时间,而只是返回到defaultLng(即`en`)。但我是菜鸟。
  • arr.indexOfO(n)obj[foo]O(1)
  • 更正:我在同一个站点上调用了其他脚本。禁用它们后,我进入 172 毫秒(不那么令人担忧)。我刚刚看到我可以进一步减少: // isL10nAvailable: if (AcceptLngs.indexOf(navPrefLng)
  • 好的,我已经用@Paul S. 的建议进行了测试,并通过删除一个函数(并用 else 替换它:) 来减少我的代码)。我回到最初的交货时间。我通过编辑帖子的标题来标记主题 [已解决]。感谢您的配合。

标签: javascript arrays performance


【解决方案1】:

使用你的数据结构,你可以做这样的事情..

const acceptedLanguages = ['de', 'en', 'es', 'fr', 'it', 'pt'];
const _getI18N = { 
    'x': {
        'en': 'color',
        'en-GB': 'colour'
    },
    'y': {
        'en': 'hello',
        'en-US': 'howdy'
     },
     'z': {}
};

找出并记录客户端和_getI18N字典之间的共同已知语言(基于acceptedLanguages

const nav = window.navigator;
const clientLanguages = [
    nav.language || nav.browserLanguage || nav.userLanguage,
    ...window.navigator.languages,
    'en'
].filter(Boolean);

const getRoot = lang => lang.split('-')[0];

const langRootIncludes = lang => {
    const root = getRoot(lang);
    return acceptedLanguages.includes(root);
};

const candidateLanguage = clientLanguages.find(
    lang => langRootIncludes(lang)
);
const candidateLanguageRoot = getRoot(candidateLanguage);

所以翻译成常见的已知语言看起来像

const translate = word => {
    const dict = _getI18N[word];
    if (!dict) return word;

    return dict[candidateLanguage] // e.g. first try pt-BR
        || dict[candidateLanguageRoot] // then fall back to pt
        || word; // then fall back to input
};

然后

candidateLanguage; // "en-US"
candidateLanguageRoot; // "en"

translate('x'); // "color", fell back to en
translate('y'); // "howdy", found en-US
translate('z'); // "z", fell back to input (no lang entry)
translate('foo'); // "foo", fell back to input (no entry at all)

【讨论】:

  • 我进行了测试,它的工作就像一个魅力(98 毫秒)。大想法
  • 我刚刚修改了const clientLanguages[(allContent) + " "].filter(Boolean); 在这里解释stackoverflow.com/questions/10145946/… 抑制TypeError: lang.split is not a function
猜你喜欢
  • 2011-02-05
  • 1970-01-01
  • 2020-09-25
  • 2011-06-07
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多