如何在Javascript中对关联数组进行排序?

时间:2010-10-27 10:34:09

标签: javascript arrays sorting associative

我需要通过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;
}

3 个答案:

答案 0 :(得分:5)

这是不可能的。当使用Object循环遍历其属性时,JavaScript中的for...in(您正在使用的“关联数组”)是specified as having no defined order。您可以在某些浏览器的行为之间找到一些共同点,但it's not universal

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

答案 1 :(得分:1)

我知道这是一个旧职位,但那项工作:

问题是

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

因为sort函数出现一个数字:

aTemp.sort(function (a, b) {
    if (a[1] < b[1])
        return 1;
    else if (a[1] > b[1])
        return -1;
    else
        return 0;
});

答案 2 :(得分:0)

我最近遇到了这个问题,发现了这个问题。我很失望地发现没有预先定义的方法来对关联数组进行排序,但它有意义并指出了我正确的方向。我没有完全意识到JS关联数组实际上是对象,只是名称中的数组。我有一个包含更多关联数组的关联数组,例如:

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

以下函数将根据它的键对上面的父数组进行排序。为了使其按写入方式工作,父数组需要与关联数组中的值匹配的键。例如,父[&#39;唯一字符串&#39;]需要具有一些键值,该值包含&#39;唯一字符串&#39;。就我而言,这是名称密钥;但是,您可以选择任何您喜欢的键。

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

这是一个简单的解决方案,但我花了一些时间才想到。希望这有助于其他人面对这个问题。