4

我正在尝试按字母顺序对我的哈希表下拉菜单进行排序...使用此功能:

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;
            }
        }
    }
4

1 回答 1

0

问题是您正在返回一个数组,并期望它是一个对象。这些在 JavaScript 中是不同的东西。没有什么是“改变”的;您的“ID”(或“哈希”)没有被修改。

clientProjectsHash从一个对象开始!对象是无序的,可以有任何字符串作为键。当您这样做时,getSortedKeys(clientProjectsHash);您将返回一个数组!数组是有序的,并且具有从 0 开始的数字索引(键)。


clientProjectsHash = getSortedKeys(clientProjectsHash);
for (clientKey in clientProjectsHash) {
}

这 用数组覆盖 。然后你在它上面(顺便说一下,你不应该使用数组)。clientProjectsHashfor..infor..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;
        }
    }
}
于 2013-07-08T16:27:43.650 回答