按排序顺序迭代Javascript关联数组

mik*_*ike 107 javascript

假设我有一个Javascript关联数组(又名哈希,又名字典):

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Run Code Online (Sandbox Code Playgroud)

如何按排序顺序迭代键?如果它有助于简化事情,我甚至不需要这些值(它们都只是数字1).

mol*_*arg 132

您可以使用Object.keys内置方法:

var sorted_keys = Object.keys(a).sort()
Run Code Online (Sandbox Code Playgroud)

(注意:这在不支持EcmaScript5的非常旧的浏览器中不起作用,特别是IE6,7和8.有关详细的最新统计信息,请参阅此表)

  • `if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } 返回结果 }` (3认同)

Mat*_*hew 123

您无法直接迭代它们,但您可以找到所有键,然后对它们进行排序.

var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;    

function keys(obj)
{
    var keys = [];

    for(var key in obj)
    {
        if(obj.hasOwnProperty(key))
        {
            keys.push(key);
        }
    }

    return keys;
}

keys(a).sort(); // ["a", "b", "z"]
Run Code Online (Sandbox Code Playgroud)

但是,不需要将变量'a'作为数组.您实际上只是将它用作对象,应该像这样创建它:

var a = {};
a["key"] = "value";
Run Code Online (Sandbox Code Playgroud)

  • 如果`obj.hasOwnProperty(key)`,你应该总是检查`for`循环. (28认同)
  • @Lalit - 如果你指的是Torok的评论,那是因为你没有任何干扰对象原型的东西,你不能依赖它. (3认同)

Luk*_*fer 14

你甚至可以把它原型化到对象上:

Object.prototype.iterateSorted = function(worker)
{
    var keys = [];
    for (var key in this)
    {
        if (this.hasOwnProperty(key))
            keys.push(key);
    }
    keys.sort();

    for (var i = 0; i < keys.length; i++)
    {
        worker(this[ keys[i] ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

var myObj = { a:1, b:2 };
myObj.iterateSorted(function(value)
{
    alert(value);
} 
Run Code Online (Sandbox Code Playgroud)

  • 我赞成这个答案似乎相当不错,但事实证明它打破了jquery :( http://stackoverflow.com/questions/1827458/prototyping-object-in-javascript-breaks-jquery一般被认为是一个非常糟糕的主意"你永远不应该扩展Object.prototype.它不仅仅是破坏jQuery;它完全打破了Javascript的"object-as-hashtables"特性.不要这样做.你可以问John Resig,他会告诉你同一件事情." (3认同)

Gra*_*ner 6

我同意Swingley的回答,我认为很多这些更精细的解决方案都缺失了.如果您只关心关联数组中的键并且所有值都是'1',那么只需将'keys'作为值存储在数组中.

代替:

var a = { b:1, z:1, a:1 };
// relatively elaborate code to retrieve the keys and sort them
Run Code Online (Sandbox Code Playgroud)

使用:

var a = [ 'b', 'z', 'a' ];
alert(a.sort());
Run Code Online (Sandbox Code Playgroud)

这样做的一个缺点是您无法确定是否轻松设置了特定键.有关该问题的答案,请参阅此答案中的javascript函数inArray.提出的解决方案的一个问题是,a.hasValue('key')它会稍微慢一些a['key'].在您的代码中,这可能或不重要.