4

我需要为我的一个项目按 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

这是不可能的。JavaScript 中的 An Object(这是您用作“关联数组”的内容)在使用循环迭代其属性时被指定为没有定义的顺序for...in。您可能能够观察到某些浏览器行为之间的一些共同点,但它不是通用的

摘要:如果您需要特定顺序的对象,请使用数组。

于 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 回答