Javascript 使用jQuery根据值对JSON数组排序

Javascript 使用jQuery根据值对JSON数组排序,javascript,jquery,arrays,json,sorting,Javascript,Jquery,Arrays,Json,Sorting,我有两个下拉选择下拉列表:一个用于地区,另一个用于所选地区的城市。结果由AJAX加载,在我的响应中,我得到JSON数组中的所有城市: { 1709: "Geertruidenberg", 1710: "Netersel", 1711: "Macharen", 1712: "Beers", 1713: "Hank", 1714: "Oudemolen", 1715: "Nistelrode" } 我使用这个小插件在选择下拉列表中

我有两个下拉选择下拉列表:一个用于地区,另一个用于所选地区的城市。结果由AJAX加载,在我的响应中,我得到JSON数组中的所有城市:

{
    1709: "Geertruidenberg", 
    1710: "Netersel", 
    1711: "Macharen", 
    1712: "Beers", 
    1713: "Hank", 
    1714: "Oudemolen", 
    1715: "Nistelrode"
}
我使用这个小插件在选择下拉列表中加载数据:

(function($, window) {
    $.fn.replaceOptions = function(options) {
        var self, $option;

        this.empty();
        self = this;

        $.each(options, function(index, option) {
            $option = $("<option></option>")
                .attr("value", index)
                .text(option);
            self.append($option);
        });
    };
})(jQuery, window);
除了city下拉列表根据JSON数组键自动排序外,所有这些都可以正常工作。我尝试使用sort方法,但它不起作用,因为它是一个对象而不是数组。然后我尝试创建一个数组:

var values = [];
$.each(data.cities, function(index,value)) {
    values[index] = value;
}
但由于某种原因,下拉列表从1填充到城市数组的第一个id键,我不知道为什么它会这样做,数组本身看起来很好


如何对事物进行排序,使我的城市在下拉列表中按字母顺序排列?

需要将其转换为数组,以便对其进行排序。假设这是你的目标。请注意,我将其重新排列为未排序,以证明这是有效的

originalData = {
    1712: "Beers", 
    1709: "Geertruidenberg", 
    1710: "Netersel", 
    1713: "Hank", 
    1714: "Oudemolen", 
    1711: "Macharen", 
    1715: "Nistelrode"
};
现在要创建一个数组版本,我们需要创建一个数组,并将对象插入其中。我今年要给钥匙打电话。注意,我们正在对键调用parseInt。JavaScript中除数组外的键始终是字符串。例如,{foo:bar}有一个字符串键foo。这也适用于数字外观的关键点

var dataArray = [];
for (year in originalData) {
    var word = originalData[year];
    dataArray.push({year: parseInt(year), word: word});
}
现在有可能我们的数据没有排序,所以我们手动排序。请注意,这是一种区分大小写的排序。例如,Qux在foo之前

dataArray.sort(function(a, b){
    if (a.word < b.word) return -1;
    if (b.word < a.word) return 1;
    return 0;
});

这将执行您想要的操作,并处理空ID/未定义的值:

var data = {
    1709: "Geertruidenberg", 
    1710: "Netersel", 
    1711: "Macharen", 
    1712: "Beers", 
    1713: "Hank", 
    1714: "Oudemolen", 
    1715: "Nistelrode"
};

var values = [];
$.each(data, function(index, value) {
    values[index] = value;
});

values.sort();

$.each(values, function(index, value) {
    if(value != undefined) {
        $("#Profile_cityId").append("<option>"+ value +"</option");
    }
});

只需将我放入的append替换为您自己的函数,因为jsFiddle在使用它时给我带来了麻烦。演示:

请注意,对象的顺序永远无法保证,因此在进行排序时,您可能应该使用正确的数组。我知道,使用.sort对对象进行排序甚至是不可能的,这就是我将其转换为正确的javascript数组的原因,但是它从1填充到城市的最低id,只有键,没有值,所以在城市出现之前我得到了一堆空的
$.fn.replaceOptions = function(options) {
    var self, $option;

    this.empty();
    self = this;

    $.each(options, function(index, option) {
        $option = $("<option></option>")
            .attr("value", option.year)
            .text(option.word);
        self.append($option);
    });
};
$('#mylist').replaceOptions(dataArray);
var data = {
    1709: "Geertruidenberg", 
    1710: "Netersel", 
    1711: "Macharen", 
    1712: "Beers", 
    1713: "Hank", 
    1714: "Oudemolen", 
    1715: "Nistelrode"
};

var values = [];
$.each(data, function(index, value) {
    values[index] = value;
});

values.sort();

$.each(values, function(index, value) {
    if(value != undefined) {
        $("#Profile_cityId").append("<option>"+ value +"</option");
    }
});