JavaScript排序对象更改ID号码

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

3
这不应该改变ID,代码中还有更多内容吗?这些ID是动态生成的吗? - casraf
1
你唯一需要更改的地方就在这行代码:keys[keys.length-1]['key'] = key;。这与“ID”有关吗?如果不是,请详细说明你的问题。 - Felix Kling
你说的“id”是什么?“obj”看起来像什么?当你对一个数组进行排序时,值可能会有新的键(因为它们可能在新的位置)。 - gen_Eric
1
我仍然不明白问题在哪里。getSortedKeys(clientProjectsHash) 返回了一个正确排序并且带有正确键的数组。我确实看到你正在覆盖 clientProjectsHash。另外,你正在对一个数组使用 for..in,不要这样做。 - gen_Eric
1
从getInitialClient()函数中,您期望返回什么值? - omma2289
显示剩余3条评论
1个回答

0
问题在于你返回了一个数组,但期望它是一个对象。在JavaScript中,这些是不同的东西。没有什么“改变”的;你的“ids”(或“hashes”)并没有被修改。
你的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;
        }
    }
}

@rubberchicken:你说的“id为空”是什么意思?哪个id?你想要访问什么?你想要做什么?我还是不知道你的问题在哪里。也许我从getInitialClient返回了错误的值,我改成返回ID了,试试看? - gen_Eric
它现在不排序。我在主编辑中添加了图片供您查看。 - rubberchicken
我之前在这个话题上寻求过帮助...链接:http://stackoverflow.com/questions/17003844/sorting-my-javascript-pull-down-menu-by-name-not-key - rubberchicken
@rubberchicken: 你是怎么试图获取“KEY”值的? - gen_Eric
不用担心...我从一开始就不喜欢使用JavaScript..我会尝试用另一种语言重新编写整个函数。感谢您的时间和帮助。 - rubberchicken
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接