Я немного поглядел на это и сначала подумал, что он должен быть похож на другие публикации, но вы не сортируете ни идентификатор, ни имя (текст), а какое-то другое значение. Чтобы облегчить это, я создал объект, в котором хранятся все страны и города, а затем помещается в них. Затем я сортирую с помощью sortOrder, который вставляется в список опций как data-sort
и функцию для сортировки.
Я вижу ваш currentCity
, но это может измениться при изменении страны? Поэтому я поставил «дефолт» для каждой страны, поставив isDefault:true
на город.
Я также вытолкнул страны из списка, по умолчанию там.
Это может быть излишним для вашей ситуации, но взять то, что вам нравится.
Создание пространства имен
var myApp = myApp || {};// create a namespace to use.
добавить страны объекта:
myApp.countries = [{
"name": "United Kingdom",
isDefault: true,
id: 1,
"cities": [{
id: 1,
name: "Bedfordshire",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "Berkshire",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Birmingham",
"sortOrder": 3,
"isCapital": false
}, {
id: 4,
name: "Brighton",
"sortOrder": 4,
"isCapital": false,
isDefault:true
}, {
id: 5,
name: "Buckinghamshire",
"sortOrder": 6,
"isCapital": false
}, {
id: 6,
name: "Appleton",
"sortOrder": 5,
"isCapital": false
}, {
id: 37,
name: "London",
"sortOrder": 0,
"isCapital": true
}]
}, {
"name": "Hackem",
id: 2,
"cities": [{
id: 1,
name: "Somecity",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "Waterton",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Acre City",
"sortOrder": 3,
"isCapital": false
}, {
id: 4,
name: "Jackson",
"sortOrder": 4,
"isCapital": false
}, {
id: 5,
name: "Tolkenshire",
"sortOrder": 6,
"isCapital": false
}, {
id: 6,
name: "Capital City",
"sortOrder": 0,
"isCapital": true
}, {
id: 37,
name: "Paris",
"sortOrder": 4,
"isCapital": false
}]
}, {
"name": "NewCountry",
id: 3,
"cities": [{
id: 1,
name: "Skycity",
"sortOrder": 1,
"isCapital": false
}, {
id: 2,
name: "DirtCity",
"sortOrder": 2,
"isCapital": false
}, {
id: 3,
name: "Airville",
"sortOrder": 3,
"isCapital": false
}, {
id: 6,
name: "Cape Town",
"sortOrder": 0,
"isCapital": true
}, {
id: 37,
name: "Walla Walla",
"sortOrder": 4,
"isCapital": false
}]
}];
Добавьте некоторые функции пространства имен для использования:
myApp.arrayObj = myApp.arrayObj || {
lookup: function(myArray, searchTerm, property, firstOnly) {
var found = [];
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) {
found.push(myArray[i]);
if (firstOnly) break; //if only the first
}
}
return found;
},
updateCityOptions: function(countries) {
var $cityAll = $("#ListingCity");
// lookup by text
var $countryText = $("#ListingCountry option:selected").text();
var ac = this.lookup(countries, $countryText, "name", true)[0].cities;
// lookup by id (alternate approach)
// var $countryId = $("#ListingCountry option:selected").val();
// var ac = this.lookup(countries, $countryId , "id", true)[0].cities;
if (ac) {
$('#ListingCity option:gt(0)').remove();
var opt = '<option></option>';
var newOptions = "";
$.each(ac, function(k2, v2) {
// var sel = currentCity == v2.name ? ' selected="selected" ' : "";
var sel = v2.isDefault ? ' selected="selected" ' : "";
opt = '<option data-sort="' + v2.sortOrder + '"' + sel + ' value="' + v2.id + '">' + v2.name + '</option>';
newOptions += opt;
});
$cityAll.append(newOptions); //hit the DOM just once
$cityAll.sortOptions(); // sort what we put in
$(".city").fadeIn(300);
} else {
$cityAll.find('option:gt(0)').remove();
$(".city").fadeOut(300);
}
$cityAll.trigger('change');// because it changed
},
setCountries: function(nation) {
var $countries = $("#ListingCountry");
$countries.find('option:gt(0)').remove();
var opt = '';
var newOptions = "";
$.each(nation, function(k2, v2) {
var sel = v2.isDefault ? ' selected="selected" ' : "";
opt = '<option data-sort="' + v2.sortOrder + '"' + sel + ' value="' + v2.id + '">' + v2.name + '</option>';
newOptions += opt;
});
$countries.append(newOptions); //hit the DOM just once
}
};
Создание ключа функции сортировки: код
// sort the select
$.fn.sortOptions = function() {
$(this).each(function() {
var op = $(this).children("option");
op.sort(function(a, b) {
return $(a).data('sort') > $(b).data('sort') ? 1 : -1;
})
return $(this).empty().append(op);
});
}
Запуск:
myApp.arrayObj.setCountries(myApp.countries);
// could be done is way but we trigger the country change which does this
// myApp.arrayObj.updateCityOptions(myApp.countries);
Handle событие изменения страна:
$('#ListingCountry').on('change', function() {
myApp.arrayObj.updateCityOptions(myApp.countries);
}).trigger('change');
Edit: Примечание вы можете удалить все "isCapital": false
, если хотите оставить только "isCapital": true
, и все будет работать так же.
Sample играть здесь: https://jsfiddle.net/MarkSchultheiss/okk22ovq/2/
EDIT: Бонус; альтернативные варианты сортировки
// sort the select
$.fn.sortOptionsByText = function() {
$(this).each(function() {
var op = $(this).children("option");
op.sort(function(a, b) {
return a.text > b.text ? 1 : -1;
})
return $(this).empty().append(op);
});
}
// sort the select
$.fn.sortOptionsByValue = function() {
$(this).each(function() {
var op = $(this).children("option");
op.sort(function(a, b) {
return a.value > b.value ? 1 : -1;
})
return $(this).empty().append(op);
});
}
// sort the select **IF** we had a "mostused" data-mostused value
// sort the select
$.fn.sortOptions = function() {
$(this).each(function() {
var op = $(this).children("option");
op.sort(function(a, b) {
return $(a).data('mostused') > $(b).data('mostused') ? 1 : -1;
})
return $(this).empty().append(op);
});
}
Является ли Лондон 'currentCity' в аргументе функции? Вы можете просто использовать '.prepend' вместо' .append', чтобы вставить его в начале поля '
@StuartPinfold, не могли бы вы дать некоторую обратную связь или принять ответ, который вам больше всего подходит? – trincot