我正在尝试按字母顺序对哈希表下拉菜单进行排序...使用此功能:
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;
});
}
这会对下拉菜单进行排序...虽然它会更改我的菜单项的原始ID#,这会在我的网站上解决一些问题...是否可以保留每个菜单项的原始ID#并仍然排序?
抱歉,这是哈希码:var clientProjectsHash = {};
clientProjectsHash['1'] = {};
clientProjectsHash['1']['name'] = 'RONA';
clientProjectsHash['2'] = {};
clientProjectsHash['2']['name'] = 'CMS';
clientProjectsHash['3'] = {};
clientProjectsHash['3']['name'] = 'ALT';
和getSortedKeys由:
调用function getInitialClient() {
clientProjectsHash = getSortedKeys(clientProjectsHash);
for (clientKey in clientProjectsHash) {
if(clientKey > 0) {
return clientKey;
}
}
}
答案 0 :(得分:0)
问题是你正在返回一个数组,并期望它是一个对象。这些是JavaScript中的不同内容。没有什么是“改变”;你的“ids”(或“哈希”)没有被修改。
您的clientProjectsHash
作为对象启动!对象是无序的,可以将任何字符串作为键。当您执行getSortedKeys(clientProjectsHash);
时,您将返回数组!数组是有序的,并且具有从0开始的数字索引(键)。
clientProjectsHash = getSortedKeys(clientProjectsHash);
for (clientKey in clientProjectsHash) {
}
使用数组覆盖 clientProjectsHash
。然后你for..in
覆盖它(顺便说一句,你应该不使用for..in
用于数组。
从getSortedKeys
返回的数组如下所示:
[
{
name: 'ALT',
key: 3
},
{
name: 'CMS',
key: 2
},
{
name: 'RONA',
key: 1
}
]
因此,在for..in
中,clientKey
将是0
,1
和2
。数组的索引。您的key
值未正在更改,您只是读取了错误的值。
请改为尝试:
function getInitialClient() {
var clientKeys = getSortedKeys(clientProjectsHash);
for(var i = 0, len = clientKeys.length; i < len; i++){
var clientKey = clientKeys[i];
if(clientKey.key > 0){
return clientKey.key;
}
}
}