Skip to content

Instantly share code, notes, and snippets.

@viniceosm
Created March 24, 2020 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viniceosm/8029775072dcb4d52923c1afadfebd02 to your computer and use it in GitHub Desktop.
Save viniceosm/8029775072dcb4d52923c1afadfebd02 to your computer and use it in GitHub Desktop.
Order array by multiple keys

Exemplo

var homes = [
	{ city: 'A', price: 2, id: 0 },
	{ city: 'A', price: 3, id: 2 },
	{ city: 'A', price: 3, id: 1 },
	{ city: 'A', price: 2, id: 5 },
	{ city: 'B', price: 1, id: 6 },
	{ city: 'B', price: 1, id: 0 }
];

console.log(sortMutiKeys(homes, 'city ASC', 'price DESC', 'id DESC'));

Função

function sortMutiKeys(array, ...filters) {
	var calcSortNumberDESC = (a, b, key) => b[key] - a[key];
	var calcSortNumberASC = (a, b, key) => a[key] - b[key];
	var calcSortStringASC = (a, b, key) => a[key] > b[key] ? 1 : -1;
	var calcSortStringDESC = (a, b, key) => a[key] < b[key] ? 1 : -1;

	var sortNumberOrString = (a, b, keyOrder) => {
		if (keyOrder !== undefined) {
			var [key, order] = keyOrder.split(' ');

			if (!isNaN(a[key]) && !isNaN(b[key])) {
				if (order == 'ASC') return calcSortNumberASC(a, b, key);
				else if (order == 'DESC') return calcSortNumberDESC(a, b, key);
			} else {
				if (order == 'ASC') return calcSortStringASC(a, b, key);
				else if (order == 'DESC') return calcSortStringDESC(a, b, key);
			}
		}
	}
	return array.sort((a, b) => {
		var index = 0;

		var valuesEqual = (a, b, keyOrder) => {
			var [key, order] = keyOrder.split(' ');
			if (a[key] === b[key]) index++;
			return a[key] === b[key];
		}

		while(index < filters.length) {
			if (!valuesEqual(a, b, filters[index])) {
				return sortNumberOrString(a, b, filters[index]);
			}
		}

		return sortNumberOrString(a, b, filters[index]);
	});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment