Last active
January 13, 2021 12:21
-
-
Save christierney402/5550678 to your computer and use it in GitHub Desktop.
JS: Sort a JavaScript object by key in alphabetical order case insensitive. Thanks to Arne Martin Aurlien and Ivan Krechetov for inspiration. #snippet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Sort JavaScript Object | |
* CF Webtools : Chris Tierney | |
* obj = object to sort | |
* order = 'asc' or 'desc' | |
*/ | |
function sortObj( obj, order ) { | |
"use strict"; | |
var key, | |
tempArry = [], | |
i, | |
tempObj = {}; | |
for ( key in obj ) { | |
tempArry.push(key); | |
} | |
tempArry.sort( | |
function(a, b) { | |
return a.toLowerCase().localeCompare( b.toLowerCase() ); | |
} | |
); | |
if( order === 'desc' ) { | |
for ( i = tempArry.length - 1; i >= 0; i-- ) { | |
tempObj[ tempArry[i] ] = obj[ tempArry[i] ]; | |
} | |
} else { | |
for ( i = 0; i < tempArry.length; i++ ) { | |
tempObj[ tempArry[i] ] = obj[ tempArry[i] ]; | |
} | |
} | |
return tempObj; | |
} |
You can write it in a more functional way.
https://gist.github.com/farskid/b1c128639cd42e44734282e2d9e3beb2
function sortObjKeysAlphabetically(obj) {
return Object.keys(obj).sort((a,b) => a > b).reduce((result, key) => {
result[key] = obj[key];
return result;
}, {});
}
function sortObj(obj, order) {
switch (order) {
case 'asc':
return sortObjKeysAlphabetically(obj);
break;
case 'desc':
return sortObjKeysAlphabetically(obj).reverse();
break;
default:
throw Error('invalid order');
}
}
@farksid that didn't work perfectly. This seems to do it:
function sortObjKeysAlphabetically(obj) {
var ordered = {};
Object.keys(obj).sort().forEach(function(key) {
ordered[key] = obj[key];
});
return ordered;
}
var sortedObj = sortObjKeysAlphabetically(unorderedObj);
This code sorts objects deeply and will also handle arrays:
const alphaSort = (object: any): object => {
if (object !== null && typeof object === "object") {
return Object.keys(object)
.sort((a, b) => sortByAlphabet(a.toLowerCase(), b.toLowerCase()))
.reduce((result: object, key: string) => {
result[key] = object[key];
if (Array.isArray(result[key])) {
result[key] = result[key].map((obj: any) => alphaSort(obj));
}
return result;
}, {});
} else if (Array.isArray(object)) {
return object.map(obj => alphaSort(obj));
} else {
return object;
}
};
// function
sortArr(a, b) {
var textA = a.keyName.toUpperCase();
var textB = b.keyName.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
}
// calling function (here array is your array item)
array.sort(this.sortArr);
const sortObjKeysAlphabetically = (obj) => Object.fromEntries(Object.entries(obj).sort());
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Why not just reverse
tempArry
before the final block instead of copy/pasting the for block like that?