Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.10.2014, 19:22
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

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


ВОпрос: как можно улучшить этот код, например, как избавится от лишних циклов? Особенно от первого? Может стоит вынести все циклы в отдельную функцию, как один цикл и потом передавать в функцию нужные параметры?
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 12.10.2014, 20:00
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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);


Можно попробовать преобразовать объект в строку и через регулярку искать совпадения на "более одного".

Последний раз редактировалось ruslan_mart, 12.10.2014 в 20:06.
Ответить с цитированием
  #3 (permalink)  
Старый 12.10.2014, 20:08
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Сообщение от Ruslan_xDD Посмотреть сообщение
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);


Можно попробовать преобразовать объект в строку и через регулярку искать совпадения на "более одного".
То есть в if/else мне нужно добавить
data[i] = RC.Lang.Common.LANGUAGE_LABELS[data[i]]

и в else
data[i] = RC.Lang.Common.LANGUAGE_LIST[data[i]]

?
Ответить с цитированием
  #4 (permalink)  
Старый 12.10.2014, 20:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
как лучше сравнить переменную со значениями из массива ? mitiya Общие вопросы Javascript 2 19.09.2012 22:40
Как использовать sprit'ы? Hekumok Общие вопросы Javascript 17 10.08.2012 11:24
Как удалить повторные элементы из массива? YISHIMITSY Общие вопросы Javascript 1 04.05.2010 00:04
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53