Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save trycf/384469cfe5b9941c6b2c24da48fc5cc0 to your computer and use it in GitHub Desktop.

Select an option

Save trycf/384469cfe5b9941c6b2c24da48fc5cc0 to your computer and use it in GitHub Desktop.
TryCF Gist
<cfscript>
private numeric function sortJsonLdKeys(any a = "", any b = "") {
// @context comes first
if (a == "@context") return -1;
else if (b == "@context") return 1;
// Meta properties like @context, @id and @type come second
var aIsMeta = (left(arguments.a, 1) == "@");
var bIsMeta = (left(arguments.b, 1) == "@");
if (aIsMeta && bIsMeta) return compareNoCase(arguments.a, arguments.b);
else if (aIsMeta) return -1;
else if (bIsMeta) return 1;
// IDs come third
var aIsID = (arguments.a == "ID");
var bIsID = (arguments.b == "ID");
if (aIsID) return -1;
else if (bIsID) return 1;
aIsID = (right(arguments.a, 2) == "Id");
bIsID = (right(arguments.b, 2) == "Id");
if (aIsID && bIsID) return compareNoCase(arguments.a, arguments.b);
else if (aIsID) return -1;
else if (bIsID) return 1;
aIsID = (left(arguments.a, 2) == "By");
bIsID = (left(arguments.b, 2) == "By");
if (aIsID && bIsID) return compareNoCase(arguments.a, arguments.b);
else if (aIsID) return -1;
else if (bIsID) return 1;
// Timestamps come last
var aIsTimestamp = (arguments.a == "ts" || arguments.a == "tsUpdate" || arguments.a == "timestamp" || right(arguments.a, 2) == "At");
var bIsTimestamp = (arguments.b == "ts" || arguments.b == "tsUpdate" || arguments.b == "timestamp" || right(arguments.b, 2) == "At");
if (aIsTimestamp && bIsTimestamp) return compareNoCase(arguments.a, arguments.b);
else if (aIsTimestamp) return 1;
else if (bIsTimestamp) return -1;
return compareNoCase(arguments.a, arguments.b);
}
private numeric function structKeySort(value1, value2, key1, key2) {
return sortJsonLdKeys(key1, key2);
}
//myStruct=StructNew();
value={"@id":"Berlin", "@context":"London","id":"Paris","orderID":"New York","b":"Dublin"};
writeDump(value);
WriteOutput(serializeJSON(value));
mySort=StructSort(value, structKeySort);
writeDump(mySort);
writeDump(value);
WriteOutput(serializeJSON(value));
</cfscript>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment