我有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个数组,而不是一个,只是按数组中的字段排序。
答案 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]
。通过使用间接,您可以访问Name
,Age
和Gender
中的元素;也就是Name[idx[i]]
。
如果性能是一个问题,那么使用就地排序可能会更快,如果你只做一次。否则,我会使用间接而不会触及真正的数组。
注意: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函数中维护所有数组,如:
- 找到最低的项目。假设它在索引5处。现在在所有3个数组中将item @ index5与item @ index0交换。
- 从索引1 ...
开始重复上述逻辑 醇>