I have 3 arrays :
array 1 is \"Name\" John, Jim, Jack, Jill
array 2 is \"Age\" 25, 30, 31, 22
array 3 is \"Gender\" Male, Ma
Even though constructing Objects from the multiple arrays may be ideal. You can also do it without the object creation overhead using indirection.
/* 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]]);
}
The idx
array contains indexes to the elements of the other arrays, idx[i]
. By using indirection you can access the element in Name
, Age
and Gender
; that is, Name[idx[i]]
.
If performance is a problem then constructing the objects may be faster using in-place sorting, if you just do it once. Otherwise, I would use the indirection without never touching the real arrays.
There you go.
Note: The comparator
function is just an example, you need to actually create your own comparator functions based on your criteria.
Having tried making objects (as suggested in some of the comments) I'm not sure the added complexity is worth it, but will post it here anyway in case it's useful. In this particular case a Person
object serves little purpose and what is potentially more useful is an aggregate object (PersonSet
) that will store the joint data, sort it, and deal with the lists of each type of characteristic as input and output. (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'));
Given your constraint why not just write your own sort function. Inside the sort function maintain all the arrays like:
- Find the lowest item. Say it is at index 5. Now swap item@index5 with item@index0 in all 3 arrays.
- Repeat the above logic starting from index 1...
If you are wanting to sort the data in a table you should have a look at Tablesorter