按属性值排序复杂的Javascript对象

时间:2016-02-10 01:16:36

标签: javascript object

我有一个国家/地区对象,其中包含一个带有国家/地区缩写的键,后跟一个带有id,name和defaultCurrency的对象。

如果我想按照国家/地区的名称对对象进行排序,我该怎么办?

var countries= {
    AD: { id: 'AD', name: 'Andorra', defaultCurrency: 'EUR' },
    AE: { id: 'AE', name: 'United Arab Emirates', defaultCurrency: 'AED' },
    BT: { id: 'BT', name: 'Bhutan', defaultCurrency: 'USD' },
    BW: { id: 'BW', name: 'Botswana', defaultCurrency: 'USD' },
    BZ: { id: 'BZ', name: 'Belize', defaultCurrency: 'BZD' },
    CA: { id: 'CA', name: 'Canada', defaultCurrency: 'CAD' },
    CC: { id: 'CC', name: 'Cocos (Keeling) Islands', defaultCurency: 'XAF' },
    CH: { id: 'CH', name: 'Switzerland', defaultCurrency: 'CHF' },
    CI: { id: 'CI', name: 'Côte d\'Ivoire', defaultCurrency: 'USD' },
    CK: { id: 'CK', name: 'Cook Islands', defaultCurrency: 'NZD' },
}

我尝试使用以下函数将其转换为数组,但这使得每个键都有[object]

var arr = [];
for (var key in countries) {
    if (countries.hasOwnProperty(key)) {
        arr.push(key + '=' + countries[key]);
    }
};

请注意,我不能只使用数组进行排序,需要先将整个对象转换为数组,然后再转换回对象。

3 个答案:

答案 0 :(得分:4)

所以我从转换函数开始将obj转换为数组:

var arr = [];
for (var key in countries) {
  arr.push(countries[key]);
};

然后我会对数组进行排序:

arr.sort(function(a, b) {
  return b.name - a.name;
});

答案 1 :(得分:2)

无法对对象字段进行排序,您应该首先将对象转换为数组。



var countries = {
    AD: { id: 'AD', name: 'Andorra', defaultCurrency: 'EUR' },
    AE: { id: 'AE', name: 'United Arab Emirates', defaultCurrency: 'AED' },
    BT: { id: 'BT', name: 'Bhutan', defaultCurrency: 'USD' },
    BW: { id: 'BW', name: 'Botswana', defaultCurrency: 'USD' },
    BZ: { id: 'BZ', name: 'Belize', defaultCurrency: 'BZD' },
    CA: { id: 'CA', name: 'Canada', defaultCurrency: 'CAD' },
    CC: { id: 'CC', name: 'Cocos (Keeling) Islands', defaultCurency: 'XAF'},
    CH: { id: 'CH', name: 'Switzerland', defaultCurrency: 'CHF' },
    CI: { id: 'CI', name: 'Côte d\'Ivoire', defaultCurrency: 'USD' },
    CK: { id: 'CK', name: 'Cook Islands', defaultCurrency: 'NZD' },
};

var countryList = [];

for(var isoCode in countries) {
  if(countries.hasOwnProperty(isoCode)) {
    countryList.push(countries[isoCode]);
  }
}

countryList.sort(function(country1, country2) {
  return country1.name > country2.name;
});

document.write(JSON.stringify(countryList));




答案 2 :(得分:0)

push - 将字符串添加到您的数组中(通过连接key," +"和您的国家/地区对象),这就是为什么每个国家/地区都表示为& #34;对象&#34 ;;如果您想要实际的国家/地区对象,请按这些。