2010-05-08 58 views
10

我有一個JavaScript哈希表,就像這樣:如何在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}; 

我希望將這些整理成按名稱順序,所以如果我通過哈希表遍歷它將以

another thing 
something 
zzz I fell asleep 

我去試過這樣做:

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

但它似乎並沒有工作。

編輯:它發生在我身上,或許一個排序的哈希表是一個矛盾。如果是這樣,訪問此處排序列表的最佳方式是什麼?

+0

你是不是有hastable(又名對象),也沒有合適的陣列。如果你有一個對象,你應該使用'{}'來初始化它,而不是'[]'。如果你使用'[]'初始化你有一個數組,但是不要通過'a [「one」]'和'a [「two」]'來添加它,但是通過'a.push(...) );'。只有在你知道你想要什麼樣的數據結構之後,你才能夠排序。 (順便說一下:'foo [「bar」]'和'foo.bar'相同,使用第二個,它不會阻塞代碼,並且不會出現字符串文字和大量方括號) – 2011-11-17 12:44:09

回答

16

如果你想通過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> 
+5

請注意,['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)中沒有描述屬性枚舉的順序,它是依賴於實現的......不保證,小心使用... – CMS 2010-05-08 04:46:18

+0

@CMS:所以我應該使用'for(var i = 0; i 2010-05-08 05:47:32

+2

@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)。 – CMS 2010-05-08 07:10:53

2

您的參數是thing1thing2,但你引用一些變量稱爲asp1asp2,其中,據我可以從源告訴您提供,不存在。

另外,我認爲你要找的是一個關聯數組,它沒有用[]語法實例化。在這裏看到更多的信息:

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

編輯:我不認爲有在Javascript中的數組會讓你做你想做的。

你可以有普通的舊數組,它可以讓你做自定義排序你可以有一個關聯數組,它可以讓你有指定的值。

使用常規數組,您顯然可以迭代索引。

連同關聯數組,你可以通過做for (var key in myArray)

+0

對不起,錯字.... – Colen 2010-05-08 03:40:35

+1

Be在語法上小心......它將遍歷所有對象所涉及的屬性,其中包括數組鍵之外的其他屬性。 – Syntactic 2010-05-08 04:04:02

+0

^^這是真的,但不應該成爲一個問題,只要它不從任何東西繼承。 – 2010-05-08 21:01:10

5

我的解決方案

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

OP正在使用數組「東西」不正確,所以這沒有幫助。 – 2011-08-08 15:37:36

+0

這個答案解決了我的問題。謝謝! – falsarella 2013-04-08 17:05:08

4

我開發了通過密鑰,不管排序哈希表,如果該值是一個數字或字符串的函數。如果表是關聯表,它會保留鍵。

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

這樣做:

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

我打算做這個,謝謝。 – 2012-10-04 08:52:12

+0

這正是我需要的功能,謝謝。 – analysiser 2013-08-13 20:21:06

+0

@HaykSaakian,這個函數怎麼樣?作爲一個人,我真的很佩服任何人努力維持狀態和功能,超越心智/身體問題。喝彩。 – deepelement 2015-02-18 23:45:00

相關問題