javascript sort obj更改id#'s

时间:2013-07-08 15:32:06

标签: javascript

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

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

1 个答案:

答案 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将是012。数组的索引。您的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;
        }
    }
}