【问题标题】:How to sort associative array in Javascript?如何在Javascript中对关联数组进行排序?
【发布时间】:2011-05-01 05:49:19
【问题描述】:

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

【问题讨论】:

  • 哪里失败了,错误信息是什么?
  • 啊,我的眼睛!格式..!
  • 没有错误信息,只是没有排序数组!!数组保持未排序:(
  • 也许这可以帮助你:stackoverflow.com/questions/2466356/…

标签: javascript arrays sorting associative


【解决方案1】:

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

总结:如果您需要按特定顺序排列的对象,请使用数组。

【讨论】:

  • 谢谢。这可能真的很有帮助。尝试使用数组找到解决方案。
【解决方案2】:

我知道这是一篇旧帖子,但确实有效:

问题是

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

【讨论】:

    【解决方案3】:

    我最近遇到了这个问题,发现了这个问题。我很失望地发现没有预定义的方法来对关联数组进行排序,但它是有道理的,并为我指明了正确的方向。我没有完全意识到在 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'}
    };
    

    这是一个简单的解决方案,但我花了一段时间才想到。希望这可以帮助其他人面临这个问题。

    【讨论】:

    • 我知道,这是为了显示结构,而不是您实际定义数组的方式。
    • 这意味着它不显示结构。伪代码不明确。它可能表示{ key : [], key : [] },也可能表示[ {key:[]}, {key:[]} ]。从您的代码看来,这意味着后者。所以你应该这样写。
    • 其实我刚刚看了你的代码,results[x] = givenArray[x] 不起作用,因为 x 是一个数字。也许你的意思是results[x] = givenArray[temp[x]]
    • 就数组而言,它是一个包含子关联数组的父关联数组。此外,就 [] 与 {} 而言,您意识到 JS 中的关联数组实际上只是对象,并且以相同的方式访问,所以这是一个有争议的问题。关于你的问题,是前者,而不是后者。此外,我已经编辑了我的答案,不再使用伪代码并且更加清晰。
    • "keyToSort" 未在您的代码中引用。看起来你切换到“key”简称..
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多