Как улучшить сортировку массива?
Здравствуйте, подскажите пожалуйста.
Вот написал код, который принимает в качестве параметра массив. Ячейки этого массива - объекты с параметром 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, время: 11:54. |