一次排序多个数组

我有3个数组:

  • arrays1是“名字”约翰,吉姆,杰克,吉尔

  • arrays2是“年龄”25,30,31,22

  • arrays3是“性别”男性,男性,男性,女性

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

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

希望它解释得很好。

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

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

 /* 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]]

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

你去吧

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

尝试制作对象(如某些评论中所述)我不确定增加的复杂性是否值得,但无论如何都会在此处发布,以防它有用。 在这种特殊情况下, 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'));​​​​​​​​​​ 

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

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

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