5

我有 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

4 回答 4

15

即使从多个数组构造对象可能是理想的。您也可以使用间接方法在没有对象创建开销的情况下完成此操作。

/* 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]。通过使用间接,您可以访问Name,AgeGender;中的元素 也就是说,Name[idx[i]].

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

你去吧。

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

于 2012-12-19T20:05:09.097 回答
2

尝试制作对象(如一些评论中所建议的)我不确定增加的复杂性是否值得,但无论如何都会将它发布在这里以防万一它有用。在这种特殊情况下,一个对象几乎没有什么用途,可能更有Person用的是一个聚合对象(PersonSetjsfiddle

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'));​​​​​​​​​​
于 2012-12-19T20:48:57.770 回答
0

如果你想对表格中的数据进行排序,你应该看看Tablesorter

于 2012-12-19T20:01:09.723 回答
0

鉴于您的限制,为什么不编写自己的排序函数。在 sort 函数内部维护所有数组,例如:

  1. 找到最低的项目。假设它位于索引 5。现在在所有 3 个数组中将 item@index5 与 item@index0 交换。
  2. 从索引 1 开始重复上述逻辑...
于 2012-12-19T20:04:10.700 回答