简体   繁体   English

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

[英]How do I sort a hash table in Javascript?

I have a Javascript hash table, like so: 我有一个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};

I want to sort these into order by name, so if I iterate through the hash table it will go in order 我想按名称对这些进行排序,所以如果我遍历哈希表,它将按顺序排列

another thing
something
zzz I fell asleep

I tried doing this: 我试过这样做:

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

But it doesn't seem to work. 但它似乎没有用。

Edit: it occurs to me that perhaps a sorted hash table is an oxymoron. 编辑:我觉得可能有一个排序的哈希表是矛盾的。 If so, what's the best way to get access to a sorted list of the things here? 如果是这样,在这里访问排序列表的最佳方法是什么?

If you want to iterate through a hash table in JavaScript in order, make an array, populate it with the hash keys, and then sort it. 如果要按顺序遍历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>

我的解决方案

things.sort(function(a,b){return a.name - b.name;});

I developed a function that sorts a hash table by the key, no matter if the value is a number or a string. 我开发了一个函数,通过键对哈希表进行排序,无论值是数字还是字符串。 It keeps the key if the table is an associated table. 如果表是关联表,它会保留密钥。

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

This will do : 这样做:

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 }
]
*/

your parameters are thing1 and thing2 , but you're referencing some variables called asp1 and asp2 , which, as far as I can tell from the source you've provided, do not exist. 你的参数是thing1thing2 ,但是你引用了一些名为asp1asp2变量,据我所知,你提供的源代码不存在。

Also, I think what you're looking for is an associative array, which is not instantiated with the [] syntax. 另外,我认为你正在寻找的是一个关联数组,它没有用[]语法实例化。 See here for more info: 有关详情,请参阅此处:

http://www.quirksmode.org/js/associative.html http://www.quirksmode.org/js/associative.html

EDIT: I don't think there's an array in Javascript that'll let you do what you want. 编辑:我不认为Javascript中有一个数组可以让你做你想做的事。

You can have plain old array, which will let you do the custom sorting or you can have an associative array, which will let you have the named values. 你可以使用普通的旧数组,它可以让你进行自定义排序, 或者你可以有一个关联数组,它可以让你拥有命名值。

With the regular array, you can obviously iterate through the indexes. 使用常规数组,您可以显然遍历索引。

With the associative array, you can iterate through the names by doing for (var key in myArray) 使用关联数组,您可以通过执行迭代来遍历名称for (var key in myArray)

same as eeerahul, with keys() and String().localeCompare() : 与eeerahul相同,使用keys()和String()。localeCompare():

function sort_by_key(t_kv,v_kv){
  return(Object.keys(t_kv).sort(
    function(a,b){return(
      String(t_kv[a][v_kv]).localeCompare(String(t_kv[b][v_kv])))}))
}

t={two:{s:'two',n:2},three:{s:'three',n:3},one:{s:'one',n:1}}
sort_by_key(t,'n')
    ["one", "two", "three"]
sort_by_key(t,'s')
    ["one", "three", "two"]    

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM