按名称而不是键排序我的javascript下拉菜单
我正在尝试按字母顺序对下拉菜单哈希进行排序。。。我尝试了一种有人发布的排序方法,但我得到的只是每个下拉菜单名的“未定义” 以下是哈希表:按名称而不是键排序我的javascript下拉菜单,javascript,Javascript,我正在尝试按字母顺序对下拉菜单哈希进行排序。。。我尝试了一种有人发布的排序方法,但我得到的只是每个下拉菜单名的“未定义” 以下是哈希表: var clientProjectsHash = {}; clientProjectsHash['4'] = {}; clientProjectsHash['4']['name'] = 'Alterna Savins & Credit Union'; clientProjectsHash['4']['projec
var clientProjectsHash = {};
clientProjectsHash['4'] = {};
clientProjectsHash['4']['name'] = 'Alterna Savins & Credit Union';
clientProjectsHash['4']['projects'] = {};
clientProjectsHash['5'] = {};
clientProjectsHash['5']['name'] = 'BDC';
clientProjectsHash['5']['projects'] = {};
clientProjectsHash['3'] = {};
clientProjectsHash['3']['name'] = 'BELL';
clientProjectsHash['3']['projects'] = {};
clientProjectsHash['6'] = {};
clientProjectsHash['6']['name'] = 'BNC';
clientProjectsHash['6']['projects'] = {};
function getSortedKeys(obj) {
var keys = []; for(var key in obj) keys.push(key);
return keys.sort(function(a,b){return obj[a]-obj[b]});
}
function populateClientSelect(selectedClientId) {
//get the client select
var clientSelect = document.getElementById('clientSelect');
clientProjectsHash = getSortedKeys(clientProjectsHash);
//add the clients
for (clientKey in clientProjectsHash) {
clientSelect.options[clientSelect.options.length] = new Option(clientProjectsHash[clientKey].name, clientKey);
if(selectedClientId == undefined || selectedClientId == 0) {
if(clientKey > 0) {
selectedClientId=clientKey;
}
}
if (clientKey == selectedClientId)
clientSelect.options[clientSelect.options.length-1].selected = true;
}
}
我尝试的一切都不起作用,这让我发疯
没有排序功能:下拉菜单抓取最低的键3,然后在列表上输出“BELL”,我希望Alterna Savins显示在下拉列表的顶部。在排序功能中,键数组应该接收键指向的对象,而不是键。您还可以将键的值存储在每个数组对象中,以便以后引用它。然后,排序函数应比较每个对象的name属性:
function getSortedKeys(obj) {
var keys = [];
for(var key in obj) {
keys.push(obj[key]);
keys[keys.length-1]['key'] = key;
}
return keys.sort(function(a,b){ return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;});
} // returns [{name:'...', projects:'...', key: '...'}, {}, {}]
在sort函数中,keys数组应该接收键指向的对象,而不是键指向的对象。您还可以将键的值存储在每个数组对象中,以便以后引用它。然后,排序函数应比较每个对象的name属性:
function getSortedKeys(obj) {
var keys = [];
for(var key in obj) {
keys.push(obj[key]);
keys[keys.length-1]['key'] = key;
}
return keys.sort(function(a,b){ return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;});
} // returns [{name:'...', projects:'...', key: '...'}, {}, {}]
如果更改clientProjectsHash结构,排序将变得更容易。但是,我不确定您是如何使用clientProjectsHash的。因此,我的建议可能是非现代浏览器的性能问题
var clientProjectsHash = [];
clientProjectsHash[0] = {key: 4, name: 'Alterna Savins & Credit Union', projects: {}};
clientProjectsHash[1] = {key: 5, name: 'BDC', projects: {}};
clientProjectsHash[2] = {key: 3, name: 'BELL', projects: {}};
clientProjectsHash[3] = {key: 6, name: 'BNC', projects: {}};
function sorter(a, b) {
if( a.name < b.name ) return -1;
if( a.name > b.name ) return 1;
return 0;
}
clientProjectsHash.sort(sorter);
我假设您将键值保留为对象键,以便快速访问。但是,因为现在循环速度更快了。所以,你可以尝试这样的解决方案&决定走哪条路,而不是走一条艰难的路&受苦受难
祝你好运。如果更改clientProjectsHash结构,排序将变得更容易。但是,我不确定您是如何使用clientProjectsHash的。因此,我的建议可能是非现代浏览器的性能问题
var clientProjectsHash = [];
clientProjectsHash[0] = {key: 4, name: 'Alterna Savins & Credit Union', projects: {}};
clientProjectsHash[1] = {key: 5, name: 'BDC', projects: {}};
clientProjectsHash[2] = {key: 3, name: 'BELL', projects: {}};
clientProjectsHash[3] = {key: 6, name: 'BNC', projects: {}};
function sorter(a, b) {
if( a.name < b.name ) return -1;
if( a.name > b.name ) return 1;
return 0;
}
clientProjectsHash.sort(sorter);
我假设您将键值保留为对象键,以便快速访问。但是,因为现在循环速度更快了。所以,你可以尝试这样的解决方案&决定走哪条路,而不是走一条艰难的路&受苦受难
祝你好运。这仍然不起作用。。。它抓住了钟[3],并把它贴到了榜首。。。我希望有一个解决方案,让它先发布Alterna Savins[4]…getSortedKeys返回一个数组;迭代如下:clientProjectsHash=getSortedKeysclientProjectsHash;对于var i=0;i