我正在尝试按字母顺序对哈希表下拉菜单进行排序...使用此函数:
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;
}
}
}
最佳答案
问题是您要返回一个数组,并期望它是一个对象。这些在 JavaScript 中是不同的东西。没有什么是“改变”的;您的“ID”(或“哈希”)未被修改。
您的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;
}
}
}
关于javascript 排序 obj 改变 id #'s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17530504/