Алфавитные элементы в объекте JavaScript? - PullRequest
2 голосов
/ 27 октября 2011

Скажем, у меня есть объект, который выглядит так:

countrylist:{
        regions:[
            {
                region: "Europe",
                countries: [
                    {
                        "country":"Albania",
                        "href":"eu",
                        "locale":"en_al"
                    },
                    {
                        "country":"France",
                        "href":"eu",
                        "locale":"en_fr"
                    },
                    {
                        "country":"Ireland",
                        "href":"eu",
                        "locale":"en_ie"
                    }]      
                },
                    region: "Asia",
                    countries: [
                        {
                            "country":"China",
                            "href":"as",
                            "locale":"ch"
                        },
                        {
                            "country":"Japan",
                            "href":"as",
                            "locale":"jp"
                        },
                        {
                            "country":"Thailand",
                            "href":"as",
                            "locale":"th"
                        }]      
                    }
                 ]}

Если бы вы могли видеть весь объект, вы бы увидели, что он сгруппирован по регионам, а страны внутри каждого региона отсортированы по алфавиту. Однако мне нужно заполнить выпадающее меню всех стран в алфавитном порядке, но не по регионам. Какой самый чистый способ сортировки этих предметов?

Первоначально я поместил поле страны в пустой массив и отсортировал его. Однако мне нужно сохранить связь между полем страны и соответствующими полями href и locale.

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Инициализируйте пустой массив, затем просмотрите регионы и добавьте все страны к этому массиву. Когда вы закончите, отсортируйте массив.

var countries = [];
for(var i = 0; i < countrylist.regions.length; i++)
    Array.prototype.push.apply(countries, countrylist.regions[i].countries);

countries.sort(function(a, b) {
    return a.country > b.country;
});

console.log(countries);

http://jsfiddle.net/Jehsb/

1 голос
/ 27 октября 2011

Вам нужно пройтись по своей структуре и создать массив названий стран. Затем вы можете отсортировать массив, и все готово.

var arr = [];
for(var i = 0; i < countryList.regions.length; i++){
    var countries = countryList.regions[i].countries;
    for(var j = 0; j < countries.length; j++){
        arr.push(countries[j].country);
    }
}

arr.sort();

Если вам нужна и другая информация, вам понадобится плоский массив всех объектов страны, а затем применить пользовательскую функцию сортировки:

var arr = [];
for(var i = 0; i < countryList.regions.length; i++){
    var countries = countryList.regions[i].countries;
    for(var j = 0; j < countries.length; j++){
        arr.push(countries[j]);
    }
}

arr.sort(function(xx,yy){ 
    return xx.country < yy.country ? -1 : 1;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...