一次排序多个数组

时间:2012-12-19 19:52:30

标签: javascript jquery

我有3个阵列:

  • 数组1是“名字”John,Jim,Jack,Jill

  • 数组2是“年龄”25,30,31,22

  • 阵列3是“性别”男性,男性,男性,女性

我将这些全部列在一个带有可排序标题的表中。现在排序工作正常,它按“名称”列进行排序。我怎样才能对“年龄”和“性别”数组进行排序以保持正确。我需要同时对所有3个进行排序。

_nameArray.sort(function(a, b){
    return ((a < b) ? -1 : ((a > b) ? 1 : 0));
})

希望它解释得很好。

不能改变结构,事物的方式必须是3个数组,而不是一个,只是按数组中的字段排序。

4 个答案:

答案 0 :(得分:14)

即使从多个阵列构造对象可能是理想的。您也可以使用间接在没有对象创建开销的情况下执行此操作。

/* An array of indexes */
var idx = [];
for (var i = 0; i < Name.length; i++) {
    idx.push(i);
}

/* A shorthand function */
var comparator = function(arr) {
    return function(a, b) {
        return ((arr[a] < arr[b]) ? -1 : ((arr[a] > arr[b]) ? 1 : 0));
    };
};

/* Sort by Age */
idx = idx.sort(comparator(Age));

/* Get the sorted order */
for (var i = 0; i < Name.length; i++) {
    console.log(Name[idx[i]], Age[idx[i]], Gender[idx[i]]);
}​

idx数组包含其他数组元素的索引idx[i]。通过使用间接,您可以访问NameAgeGender中的元素;也就是Name[idx[i]]

如果性能是一个问题,那么使用就地排序可能会更快,如果你只做一次。否则,我会使用间接而不会触及真正的数组。

There you go.

注意comparator函数只是一个示例,您需要根据自己的标准实际创建自己的比较器函数。

答案 1 :(得分:2)

尝试制作对象(如某些评论中所述)我不确定增加的复杂性是否值得,但无论如何都会在此处发布,以防它有用。在这种特殊情况下,Person对象没有什么用处,可能更有用的是聚合对象(PersonSet),它将存储联合数据,对其进行排序,并处理每种类型的列表。作为输入和输出的特征。 (jsfiddle

var names = ['John', 'Jim', 'Jack', 'Jill'],
    ages = [25, 30, 31, 22],
    genders = ['male', 'male', 'male', 'female'];
function Person(name, age, gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
}
function PersonSet(names, ages, genders) {
    this.content = [];
    for (var i = 0; i < names.length; i++) {
        this.content.push(new Person(names[i], ages[i], genders[i]));
        // (alternatively...)
        // this.content.push({name: names[i], age: ages[i], gender: 
        //     genders[i]});
    }
    this.sort = function(aspect) {
        this.content.sort(function(a, b) {
            return ((a[aspect] < b[aspect]) ? -1 : 
                ((a[aspect] > b[aspect]) ? 1 : 0));
        });
    };                    
    this.get = function(aspect) {
        var r = [];
        for (var i = 0; i < this.content.length; i++) {
            r.push(this.content[i][aspect]);
        }
        return r;
    }
}
var personSet = new PersonSet(names, ages, genders);
personSet.sort('age');
console.log(personSet.get('name'), personSet.get('age'), 
            personSet.get('gender'));​​​​​​​​​​

答案 2 :(得分:0)

如果您想要对表格中的数据进行排序,请查看Tablesorter

答案 3 :(得分:0)

鉴于您的约束,为什么不编写自己的排序函数。在sort函数中维护所有数组,如:

  
      
  1. 找到最低的项目。假设它在索引5处。现在在所有3个数组中将item @ index5与item @ index0交换。
  2.   
  3. 从索引1 ...
  4. 开始重复上述逻辑