2010-05-08 2 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 

I пробовал сделать это:

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 (он же объект), ни правильного массива. Если вы хотите иметь объект, вы должны инициализировать его с помощью '{}' not with '[]'. Если вы инициализируетесь с помощью '[]', у вас есть массив, но затем не добавляйте его с помощью 'a [" one "]' и 'a [" two "]', а 'a.push (...); '. Только после того, как вы знаете, какую структуру данных вы хотите, можете ли вы разбираться в сортировке. (BTW: '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

+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

2

ваши параметры thing1 и thing2, но вы ссылки некоторые переменные, называемые asp1 и asp2, которые, насколько я могу сказать от источника вы предоставили, не существует.

Кроме того, я думаю, что вы ищете ассоциативный массив, который не создается с помощью синтаксиса []. Смотрите здесь для получения дополнительной информации:

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

EDIT: Я не думаю, что есть массив в JavaScript, который будет препятствовать вам делать то, что вы хотите.

У вас может быть простой старый массив, который позволит вам выполнить пользовательскую сортировку или, у вас может быть ассоциативный массив, который позволит вам иметь именованные значения.

С помощью обычного массива вы можете, очевидно, перебирать индексы.

С ассоциативным массивом можно перебирать имена, делая for (var key in myArray)

+0

К сожалению, опечатка – Colen

+1

Be осторожно с тем, что ... в синтаксисе.Он будет перекрывать * все * свойства, которые имеет объект, который включает в себя вещи, отличные от ключей массива. – Syntactic

+0

^^ Это верно, но не должно быть проблемой, если она ничего не наследует. –

5

Мое решение

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

OP неправильно использует массив 'things', поэтому это не поможет. –

+0

Этот ответ решил мою проблему. Благодаря! – falsarella

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

Я планирую быть этим, спасибо. –

+0

Это именно то, что мне нужно, спасибо. – analysiser

+0

@ Хайк Саакян, как происходит функция? как человек, я действительно восхищаюсь чьим-либо усилием поддерживать как состояние, так и функционировать за пределами проблемы разума/тела. Браво. – deepelement

Смежные вопросы