【问题标题】:Alphabetize items in a JavaScript object?按字母顺序排列 JavaScript 对象中的项目?
【发布时间】:2011-12-16 01:19:25
【问题描述】:

假设我有一个看起来像这样的对象:

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"
                        }]      
                    }
                 ]}

如果您可以看到整个对象,您会看到它按地区分组,并且每个地区内的国家/地区按字母顺序排序。但是,我需要填充所有国家的下拉菜单,按字母顺序排列,但不是按地区。对这些物品进行分类的最干净的方法是什么?

我最初将 country 字段推送到一个空数组并对其进行排序。但是,我需要保留 country 字段与其对应的 href 和 locale 字段之间的关系。

【问题讨论】:

  • 我可能错了,但您是否错过了第二个区域的左大括号?
  • 我在模拟这个虚拟对象时可能遗漏了一些东西。

标签: javascript sorting object


【解决方案1】:

初始化一个空数组,然后遍历区域并将所有国家/地区附加到该数组中。完成后,对数组进行排序。

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/

【讨论】:

  • 我一开始是这样做的,但我还需要保持 href 和 locale 字段可用。我需要像这样(在伪代码中)生成下拉列表:。我将如何保留新的按字母顺序排列的数组与其各自的 href 和 locale 字段之间的关系?
  • 酷!让我试试看。
  • 请注意,@Matt 的排序功能可能跨浏览器更可靠。
【解决方案2】:

您需要遍历您的结构并创建一组国家/地区名称。然后你可以对数组进行排序,你就完成了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多