在Javascript中对关联数组进行排序

时间:2011-07-08 23:23:13

标签: javascript

我是这位董事会的新手已经在这里钓了很长时间了,这是我第一次在这里发帖。我现在有点像堵塞我在javascript中有一个看起来像这样的数组。每个ID都与人名相关联

        Array
         (
            [230] => Smith, Marc-Andre 
            [11369] => Smith, Wayne 
            [12561] => Smith, Diane 
            [12637] => Smirnova, Natalie
         )

现在,数组按索引排序,索引是人的ID。我想知道是否可以按字母顺序对其进行排序,使得数组现在看起来像

          Array
          (
             [12637] => Smirnova, Natalia 
             [12561] => Smith, Diane 
             [230] => Smith, Marc-Andre 
             [11369] => Smith, Wayne       
          )

到目前为止,我尝试使用array.sort()它按字母顺序排序,但ID丢失了它给了我

      Array
          (
             [0] => Smirnova, Natalia 
             [1] => Smith, Diane 
             [2] => Smith, Marc-Andre 
             [3] => Smith, Wayne       
          )

这是我第一次编写javascript,所以感谢您提前获得所有帮助。

3 个答案:

答案 0 :(得分:2)

将条目作为对象存储在具有ID和name属性的数组中。 JSON看起来像:

[ {'id':230,'name':'Smith, Marc-Andre'}, {'id':11369,'name':'Smith, Wayne'}, {'id':12561,'name':'Smith, Diane'}, {'id':12637,'name':'Smirnova, Natalie'} ]

然后将函数传递给Array.sort()以选择要排序的属性。见https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/sort

答案 1 :(得分:1)

您可以执行以下操作:

function arrayify(arg) {
    var ret = [];
    for (var i in arg) {
        if (!arg.hasOwnProperty(i) continue;
        ret.push({key: i, value: arg[i]});
    }
    return ret;
}

arr = arrayify(arr).sort(function(a, b) {
    return a.key.toString() - b.key.toString();
});

答案 2 :(得分:1)

你不能用一个简单的数组来做你想要的。根据定义,数组是由数组索引排序的数据列表。您要求通过除数组索引之外的其他内容进行排序。我认为最简单的存储方式最终会像这样:

   var myData = [
        [12637, "Smirnova, Natalia"], 
        [12561, "Smith, Diane"], 
        [230, "Smith, Marc-Andre"], 
        [11369, "Smith, Wayne"]
    ];

因此,它将是一个数组数组,其中每个子数组包含两个项目,第一个是id,第二个是名称。这与wmorrell提​​出的相似,但略有不同。

然后,您可以通过将自定义比较传递到排序例程中,按姓氏对数据进行排序,如下所示:

// custom sort (assumes all data is fully formed)
// sorts in ascending order by the 2nd item in each embedded array
    myData.sort(function(a,b) {
      if (a[1] < b[1]) return(-1);
      if (a[1] > b[1]) return(1);
      return(0); 
    });