我有一个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 :(得分:17)
如果要按顺序遍历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>
答案 1 :(得分:6)
我的解决方案
things.sort(function(a,b){return a.name - b.name;});
答案 2 :(得分: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;
}
这样做:
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 }
]
*/
答案 3 :(得分:2)
您的参数为thing1
和thing2
,但您引用了一些名为asp1
和asp2
的变量,据我所知,从源头来看已提供,不存在。
另外,我认为你要找的是一个关联数组,它没有用[]
语法实例化。有关详细信息,请参阅此处:
http://www.quirksmode.org/js/associative.html
编辑:我不认为Javascript中有一个数组可以让你做你想做的事。
你可以使用普通的旧数组,它可以让你进行自定义排序或你可以有一个关联数组,它可以让你拥有命名值。
使用常规数组,您显然可以遍历索引。
使用关联数组,您可以通过执行for (var key in myArray)
答案 4 :(得分:0)
与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"]