JavaScript sort multi dimensional array on specific columnsJavaScript sort multi dimensional array on specific columnsJavaScript sort multi dimensional array on specific columnsJavaScript sort multi dimensional array on specific columns
<script>
const data = [{
years: 15,
name: 'David',
age: 28
}, {
years: 20,
name: 'Joe',
age: 23
}, {
years: 12,
name: 'Tracy',
age: 28
}, {
years: 18,
name: 'Joel',
age: 25
}, {
years: 19,
name: 'Michael',
age: 40
}, {
years: 11,
name: 'Arnold',
age: 35
}, {
years: 15,
name: 'Paul',
age: 24
}, ];
console.log('sorted by Age (desc), Name (asc), Years (desc):', multiSort(data, {
age: 'desc',
name: 'asc',
years: 'desc'
}));
/**
* Sorts an array of objects by column/property.
* @param {Array} array - The array of objects.
* @param {object} sortObject - The object that contains the sort order keys with directions (asc/desc). e.g. { age: 'desc', name: 'asc' }
* @returns {Array} The sorted array.
*/
function multiSort(array, sortObject = {}) {
const sortKeys = Object.keys(sortObject);
// Return array if no sort object is supplied.
if (!sortKeys.length) {
return array;
}
// Change the values of the sortObject keys to -1, 0, or 1.
for (let key in sortObject) {
sortObject[key] = sortObject[key] === 'desc' || sortObject[key] === -1 ? -1 : (sortObject[key] === 'skip' || sortObject[key] === 0 ? 0 : 1);
}
const keySort = (a, b, direction) => {
direction = direction !== null ? direction : 1;
if (a === b) { // If the values are the same, do not switch positions.
return 0;
}
// If b > a, multiply by -1 to get the reverse direction.
return a > b ? direction : -1 * direction;
};
return array.sort((a, b) => {
let sorted = 0;
let index = 0;
// Loop until sorted (-1 or 1) or until the sort keys have been processed.
while (sorted === 0 && index < sortKeys.length) {
const key = sortKeys[index];
if (key) {
const direction = sortObject[key];
sorted = keySort(a[key], b[key], direction);
index++;
}
}
return sorted;
});
}
</script>