【发布时间】: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.indexOf是 O(n),obj[foo]是 O(1) -
更正:我在同一个站点上调用了其他脚本。禁用它们后,我进入 172 毫秒(不那么令人担忧)。我刚刚看到我可以进一步减少: // isL10nAvailable: if (AcceptLngs.indexOf(navPrefLng)
-
好的,我已经用@Paul S. 的建议进行了测试,并通过删除一个函数(并用 else 替换它:) 来减少我的代码)。我回到最初的交货时间。我通过编辑帖子的标题来标记主题 [已解决]。感谢您的配合。
标签: javascript arrays performance