Как улучшить сортировку массива?
Здравствуйте, подскажите пожалуйста.
Вот написал код, который принимает в качестве параметра массив. Ячейки этого массива - объекты с параметром locale. Задача в следующем: найти повторение языков, то есть, если у нас есть в списке 2 и более английских(en_CA , en_US - определяем по префиксу en), то мы берем все совпадения языков и записываем их, каждое, в свойство RC.Lang.Common.LANGUAGE_LIST в противном случае, если язык не повторяется, то записываем его RC.Lang.Common.LANGUAGE_LABELS. Вот код ниже
var test = [{locale:"en_US"}, {locale:"en_GB"}, {locale:"ru"}];
function getArrayLanguages3(array) {
var languageStore = array.slice();
var getShortLang = function (str) {
return str.match(/[a-z]+/)[0];
};
for (var langLabelIndex = 0; langLabelIndex < array.length; langLabelIndex ++) {
var langLabel = array[langLabelIndex].locale;
languageStore[langLabelIndex] = RC.Lang.Common.LANGUAGE_LABELS[langLabel];
}
for (var langListIndexNow = 0; langListIndexNow < array.length; langListIndexNow ++) {
var shortLangListsNow = getShortLang(array[langListIndexNow].locale),
langListNow = array[langListIndexNow].locale;
for (var langListIndexNext = langListIndexNow + 1; langListIndexNext < array.length; langListIndexNext ++) {
var shortLangListsNext = getShortLang(array[langListIndexNext].locale),
langListNext = array[langListIndexNext].locale;
if (shortLangListsNow == shortLangListsNext) {
languageStore[langListIndexNow] = RC.Lang.Common.LANGUAGE_LIST[langListNow];
languageStore[langListIndexNext] = RC.Lang.Common.LANGUAGE_LIST[langListNext];
}
}
}
return languageStore;
}
console.log(getArrayLanguages3(test));
ВОпрос: как можно улучшить этот код, например, как избавится от лишних циклов? Особенно от первого? Может стоит вынести все циклы в отдельную функцию, как один цикл и потом передавать в функцию нужные параметры? Спасибо. |
var test = [{locale:"en_US"}, {locale:"en_GB"}, {locale:"ru"}];
function getArrayLanguages(data) {
var dataString = JSON.stringify(data),
elem, i,
isOverOne = function(prop) {
prop = '"locale":"' + prop + '(_\\w+)?"';
return new RegExp(prop + '.+' + prop).test(dataString);
};
for(i in data) {
elem = data[i]; //Записываем объект языка в переменную элем
if(isOverOne(elem.locale.match(/^([a-z]+)_?/)[1])) {
//Если более одного элемента с префиксом текущего языка
}
else {
//Если только один элемент
}
}
}
getArrayLanguages(test);
Можно попробовать преобразовать объект в строку и через регулярку искать совпадения на "более одного". |
Цитата:
data[i] = RC.Lang.Common.LANGUAGE_LABELS[data[i]] и в else data[i] = RC.Lang.Common.LANGUAGE_LIST[data[i]] ? |
Armen,
ну если я правильно понял задачу, то да:
var test = [{locale:"en_US"}, {locale:"en_GB"}, {locale:"ru"}];
function getArrayLanguages(data) {
var dataString = JSON.stringify(data),
elem, i,
isOverOne = function(prop) {
prop = '"locale":"' + prop + '(_\\w+)?"';
return new RegExp(prop + '.+' + prop).test(dataString);
};
for(i in data) {
elem = data[i];
data[i] = isOverOne(elem.locale.match(/^([a-z]+)_?/)[1]) ? RC.Lang.Common.LANGUAGE_LABELS[elem] : RC.Lang.Common.LANGUAGE_LIST[elem];
}
}
getArrayLanguages(test);
|
| Часовой пояс GMT +3, время: 07:44. |