什么是最';纯JavaScript';如何编写我的函数,减少执行时间? var AcceptLngs=['de','en','es','fr','it','pt','pt BR'], _getI18N={ “wordToTranslate”:{ “pt”:“translatedWord”, [...] }, “第二次翻译”:{ 'pt BR':'translatedWord`, [...] } }, nav=window.navigator, navLng=nav.language | | nav.browserLanguage | | nav.userLanguage, prefs=导航语言, navPrefLng=prefs[0], defaultLng='en', lng=navLng,//必须设置为转换 //检查导航器的语言。 checkLng=函数checkLng(){ //ISL10Navaailable: if(接受索引(导航预液化)
我是JavaScript的初学者。我的剧本行得通。问题在于它的执行时间。我从102毫秒(没有翻译)到448毫秒(有翻译) 我试过使用loop,但没能使它正常工作。他没有在什么是最';纯JavaScript';如何编写我的函数,减少执行时间? var AcceptLngs=['de','en','es','fr','it','pt','pt BR'], _getI18N={ “wordToTranslate”:{ “pt”:“translatedWord”, [...] }, “第二次翻译”:{ 'pt BR':'translatedWord`, [...] } }, nav=window.navigator, navLng=nav.language | | nav.browserLanguage | | nav.userLanguage, prefs=导航语言, navPrefLng=prefs[0], defaultLng='en', lng=navLng,//必须设置为转换 //检查导航器的语言。 checkLng=函数checkLng(){ //ISL10Navaailable: if(接受索引(导航预液化),javascript,arrays,performance,Javascript,Arrays,Performance,我是JavaScript的初学者。我的剧本行得通。问题在于它的执行时间。我从102毫秒(没有翻译)到448毫秒(有翻译) 我试过使用loop,但没能使它正常工作。他没有在AcceptedLng中检测到语言,并自动将导航语言输入我 也许,更简单地说,我应该直接在“_getI18N”中搜索,但我还不熟悉数组中的搜索,也不能得到任何结果 信息:为了翻译,我在我的脚本中使用了_getI18N[wordToTranslate][lng]。对于您的数据结构,您可以这样做 var AcceptLngs = [
AcceptedLng
中检测到语言,并自动将导航语言输入我
也许,更简单地说,我应该直接在“_getI18N”中搜索,但我还不熟悉数组中的搜索,也不能得到任何结果
信息:为了翻译,我在我的脚本中使用了_getI18N[
wordToTranslate
][lng]。对于您的数据结构,您可以这样做
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();
找出并记录客户端和\u getI18N
字典之间的一种通用已知语言(基于接受的语言
)
因此,将其翻译成通用的已知语言
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);
然后
您试过调试代码的哪一部分需要花费多少时间来进一步缩小问题的范围吗?问题似乎是(显然)setLng()调用的函数本身调用了另一个函数。我的循环测试并没有花费太多时间,只是返回给了我
nav.langue
。我尝试搜索数组并没有花费太长时间,只是返回到defaultLng
(即“en”)。但是我是一个noob。arr.indexOf
是O(n),obj[foo]
是O(1)更正:我在同一个站点上调用了其他脚本。禁用它们后,我将进入172ms(不太令人担忧)。我刚刚看到我可以进一步减少://isl10navaailable:if(AcceptLngs.indexOf(navPrefLng)<-1){lng=navPrefLng;return lng;}else{lng=navPrefLng.substring(0,2);return lng;}@Paul S.:我测试一下。好的,我用@Paul S.suggestions进行了测试,并通过删除一个函数(并用else:)来减少代码。我回到最初的交付周期。我通过编辑我文章的标题来标记主题[已解决]。谢谢你的时间。我测试了一下,工作起来很有魅力(98毫秒)。大ThksI刚刚修改了constclientlanguages[(allContent)+“”].filter(Boolean)代码>此处解释以抑制类型错误:lang.split不是函数
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)