如何在Javascript中对哈希表进行排序?

Col*_*len 12 javascript sorting hashtable

我有一个Javascript哈希表,如下所示:

var things = [ ];
things["hello"] = {"name" : "zzz I fell asleep", "number" : 7};
things["one"] = {"name" : "something", "number" : 18};
things["two"] = {"name" : "another thing", "number" : -2};
Run Code Online (Sandbox Code Playgroud)

我想按名称对这些进行排序,所以如果我遍历哈希表,它将按顺序排列

another thing
something
zzz I fell asleep
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

function compareThings(thing1, thing2) {
    var name1 = thing1["name"].toLowerCase();
    var name2 = thing2["name"].toLowerCase();
    if (name1 < name2) {
        return -1;
        }
    if (name1 > name2) {
        return 1;
        }
    return 0;
}

things.sort(compareThings);
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

编辑:我觉得可能有一个排序的哈希表是矛盾的.如果是这样,在这里访问排序列表的最佳方法是什么?

小智 18

如果要按顺序遍历JavaScript中的哈希表,请创建一个数组,使用哈希键填充它,然后对其进行排序.

<html>
<body>
<pre>
  <script>
    var things = new Object ();
    things["hello"] = {"name" : "zzz I fell asleep", "number" : 7};
    things["one"] = {"name" : "something", "number" : 18};
    things["two"] = {"name" : "another thing", "number" : -2};
    var keys = [];
    for (var key in things) {
      if (things.hasOwnProperty(key)) {
        keys.push(key);
      }
    }
    keys.sort ();
    for (i in keys) {
      var key = keys[i];
      var value = things[key];
      document.write (key +"="+value+"\n");
    }
  </script>
</pre>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[`for ... in`](https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in)语句的迭代顺序可以是任意的,那里[ECMAScript规范](http://bclary.com/2004/11/07/#a-12.6.4)中没有描述关于属性枚举的顺序,它是依赖于实现的......没有保证,小心使用...... (5认同)
  • @Kinopiko,请参阅以下文章了解更多信息:[1](http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/)和[2]( http://www.dhtmlkitchen.com/?category=/JavaScript/&date=2007/10/21/&entry=Iteration-Enumeration-Primitives-and-Objects). (2认同)

小智 7

我的解决方案

things.sort(function(a,b){return a.name - b.name;});
Run Code Online (Sandbox Code Playgroud)

  • OP正在使用数组`thing`错误,所以这没有帮助. (2认同)

Ati*_*nux 5

我开发了一个函数,通过键对哈希表进行排序,无论值是数字还是字符串.如果表是关联表,它会保留密钥.

function sortHashTableByKey(hash, key_order, remove_key)
{
    var tmp = [],
        end = [],
        f_order = null;
    remove_key = remove_key || false;
    for (var key in hash)
    {
        if (hash.hasOwnProperty(key))
        {
            tmp.push(hash[key][key_order]);
        }
    }
    if (hash && hash[0] && typeof(hash[0][key_order]) === 'number')
    {
        f_order = function (a, b) { return a - b; };
    }
    tmp.sort(f_order);
    function getHash(hash, value)
    {
        for (k in hash)
        {
            if (hash[k] && hash[k][key_order] === value)
            {
                return { key : k, hash : hash[k] };
            }
        }
    }
    for (var i = 0, l = tmp.length; i < l; i++)
    {
        tmp[i] = getHash(hash, tmp[i]);
        if (remove_key)
        {
            delete tmp[i].hash[key_order];
        }
        if (!hash.length)
        {
            end[tmp[i].key] = tmp[i].hash;
        }
        else
        {
            end.push(tmp[i].hash);
        }
    }
    return end;
}
Run Code Online (Sandbox Code Playgroud)

这样做:

var things = new Object ();
things["hello"] = {"name" : "zzz I fell asleep", "number" : 7};
things["one"] = {"name" : "something", "number" : 18};
things["two"] = {"name" : "another thing", "number" : -2};

things = sortHashTableByKey(things, 'name');

/*
[
  two: { name: 'another thing', number: -2 },
  one: { name: 'something', number: 18 },
  hello: { name: 'zzz I fell asleep', number: 7 }
]
*/
Run Code Online (Sandbox Code Playgroud)