4

プロジェクトの 1 つで連想配列を JS でソートする必要があります。Firefox ではうまく機能するこの機能を見つけましたが、残念ながら IE8、OPERA、CHROME では機能しません... 他のブラウザーで機能させる方法が見つからないか、目的に合った別の機能を見つけることができません。どんな助けでも本当に感謝しています。

function sortAssoc(aInput)
{
    var aTemp = [];
    for (var sKey in aInput) aTemp.push([sKey, aInput[sKey].length]);
    aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});
    var aOutput = new Object();
    //for (var nIndex = aTemp.length-1; nIndex >=0; nIndex--)
    for (var nIndex = 0; nIndex <= aTemp.length-1; nIndex++)
        aOutput[aTemp[nIndex][0]] = aInput[aTemp[nIndex][0]];
    //aOutput[aTemp[nIndex][0]] = aTemp[nIndex][1];
    return aOutput;
}
4

3 に答える 3

5

This is impossible. An Object in JavaScript (which is what you're using as your "associative array") is specified as having no defined order when iterating over its properties using a for...in loop. You may be able to observe some common ground between some browsers' behaviour, but it's not universal.

Summary: if you need objects in a specific order, use an array.

于 2010-10-27T10:55:44.267 に答える
1

私はそれが古い投稿であることを知っていますが、それは機能します:

問題は

aTemp.sort(function () {return arguments[0][1] < arguments[1][1]});

ソート機能は数字に参加するため:

aTemp.sort(function (a, b) {
    if (a[1] < b[1])
        return 1;
    else if (a[1] > b[1])
        return -1;
    else
        return 0;
});
于 2011-05-17T06:57:09.750 に答える
0

私は最近この問題に遭遇し、この質問を見つけました。連想配列をソートする事前定義された方法がないことに失望しましたが、それは理にかなっていて、正しい方向に私を向けました. 私は、JS では連想配列が実際にはオブジェクトであり、名前だけが配列であることを完全には認識していませんでした。より多くの連想配列を含む連想配列がありました。例:

var firstChild = {'id': 0, 'name': 'company Two'};
var secondChild = {'id': 1, 'name': 'company One'};
var parent = {
    'company Two': firstChild,
    'company One': secondChild
};

次の関数は、キーに基づいて上記の親配列をソートします。これが記述どおりに機能するためには、親配列には、関連付けられた配列の値と一致するキーが必要です。たとえば、parent['unique string'] には、'unique string' の値を保持する何らかのキー値が必要です。私の場合、これは名前キーです。ただし、好きなキーを選択できます。

function associativeSort(givenArray, keyToSort) {
    var results = [];

    var temp = [];
    for(var key in givenArray) {
        temp.push(givenArray[key].name);
    }
    temp = temp.sort();
    for(var x = 0; x < temp.length; x++) {
        results[x] = givenArray[temp[x]];
    }

    return results;
}

私の例の配列を考えると、この関数は次を返します。

var parent = {
    'company One': {'id': 1, 'name': 'company One'},
    'company Two': {'id': 0, 'name': 'company Two'}
};

簡単な解決策ですが、考えるのに時間がかかりました。これが、この問題に直面している他の人に役立つことを願っています。

于 2012-11-21T04:24:46.937 に答える