dav*_*vey 5 javascript arrays sorting jquery json
我有两个下拉选择下拉列表:一个用于区域,一个用于所选区域中的城市.结果由AJAX加载,在我的响应中,我得到了JSON数组中的所有城市:
{
1709: "Geertruidenberg",
1710: "Netersel",
1711: "Macharen",
1712: "Beers",
1713: "Hank",
1714: "Oudemolen",
1715: "Nistelrode"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这个小插件来加载选择下拉列表中的数据:
(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);
Run Code Online (Sandbox Code Playgroud)
而这段javascript做的AJAX请求:
$('select#Profile_regionId').change(function() {
$.post('/ajax/getcities', {regionid: $(this).val()}, function(data){
//console.log(data.cities);
$("select#Profile_cityId").replaceOptions(data.cities);
}, 'json');
});
Run Code Online (Sandbox Code Playgroud)
所有工作完全正常,除了城市下拉列表自动按JSON数组键排序.我尝试使用sort()方法,但它不起作用,因为它是一个Object而不是一个数组.然后我尝试创建它的数组:
var values = [];
$.each(data.cities, function(index,value)) {
values[index] = value;
}
Run Code Online (Sandbox Code Playgroud)
但由于某些原因,在下拉列表填充自身高达1到第一个找到城市的ID(数组的键),我不知道它为什么这样做(阵列本身看起来不错).
我如何对事物进行排序,以便我的城市按照字母顺序排列在下拉列表中?
它需要转换为数组才能对其进行排序.我们假设这是你的对象.请注意,我重新排列它是未分类的,以证明这是有效的.
originalData = {
1712: "Beers",
1709: "Geertruidenberg",
1710: "Netersel",
1713: "Hank",
1714: "Oudemolen",
1711: "Macharen",
1715: "Nistelrode"
};
Run Code Online (Sandbox Code Playgroud)
现在要创建一个数组版本,我们需要创建一个数组,并将对象插入其中.我把钥匙称为"年".请注意,我们在键上调用parseInt.JavaScript中的键(数组除外)始终是字符串.例如,{foo: "bar"}有一个字符串键"foo".这也适用于数字外观键.
var dataArray = [];
for (year in originalData) {
var word = originalData[year];
dataArray.push({year: parseInt(year), word: word});
}
Run Code Online (Sandbox Code Playgroud)
我们现在有可能将数据排除在外,因此我们手动对其进行排序.请注意,这是区分大小写的排序.例如,"Qux"出现在"foo"之前.
dataArray.sort(function(a, b){
if (a.word < b.word) return -1;
if (b.word < a.word) return 1;
return 0;
});
Run Code Online (Sandbox Code Playgroud)
该函数现在只从我们的数组中提取option.year和option.word.
$.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);
});
};
Run Code Online (Sandbox Code Playgroud)
然后你最终使用插件,传递数组.如果最适合您,您可以将所有这些代码放在插件中.
$('#mylist').replaceOptions(dataArray);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26830 次 |
| 最近记录: |