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の開始! オブジェクトは順不同で、任意の文字列をキーとして持つことができます。あなたがそうするとき、あなたは配列を返されています! 配列は順序付けられており、0 から始まる数値インデックス (キー) を持っています。getSortedKeys(clientProjectsHash);


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

これ は配列で上書き されます。次に、それを上書きします(ちなみに、配列には使用しないでください)。clientProjectsHashfor..infor..in

から返される配列はgetSortedKeys次のようになります。

[
    {
        name: 'ALT',
        key: 3
    },
    {
        name: 'CMS',
        key: 2
    },
    {
        name: 'RONA',
        key: 1
    }
]

したがって、あなたfor..inclientKey01、および になり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 に答える