I have an array of objects which I have to loop through and group duplicate values by property name "tagColor", then the grouped objects I need to sort by name. I achieved first step I sorted by color, now I need to sort only those groups by name, implementing this in angular 4, typescript
Here is array list
tags = [
{
"tagType": {
"name": "a",
"tagColor": "#0000FF"
}
},
{
"tagType": {
"name": "a",
"tagColor": "#FF0000"
}
},
{
"tagType": {
"name": "c",
"tagColor": "#FF0000",
}
},
{
"tagType": {
"name": "b",
"tagColor": "#FF0000",
}
},
{
"tagType": {
"name": "b",
"tagColor": "#0000FF",
}
}
]
my function that sorts by tagColor:
tags.sort((a, b) => a.tagType.tagColor.localeCompare(b.tagType.tagColor));
this groups by color only, but how also to sort those groups alphabetically?

You can use a single sort call, if the result of comparing tags is 0 you compare by name:
tags.sort((a, b) => {
let result = b.tagType.tagColor.localeCompare(a.tagType.tagColor);
if(result == 0) {
return a.tagType.name.localeCompare(b.tagType.name);
}
return result;
});
Or a more concise but less readable version:
tags.sort((a, b) =>
b.tagType.tagColor.localeCompare(a.tagType.tagColor) // if this is 0 (aka falsy) return the other value
|| a.tagType.name.localeCompare(b.tagType.name));
Beside the given order by color, you could use a defined custom order for the color with an object which reflects the order.
For colors, not found in the object, you could take a default value to move this colors to a defined position, to the start,
(order[a.tagType.tagColor] || -Infinity) - (order[b.tagType.tagColor] || -Infinity)
to the end,
(order[a.tagType.tagColor] || Infinity) - (order[b.tagType.tagColor] || Infinity)
or inbetween.
(colorOrder[a.tagType.tagColor] || 1.5) - (colorOrder[b.tagType.tagColor] || 1.5)
var tags = [{ tagType: { name: "a", tagColor: "#0000FF" } }, { tagType: { name: "a", tagColor: "#FF0000" } }, { tagType: { name: "c", tagColor: "#FF0000" } }, { tagType: { name: "b", tagColor: "#FF0000" } }, { tagType: { name: "b", tagColor: "#0000FF" } }],
colorOrder = { "#0000FF": 1, "#FF0000": 2 };
tags.sort((a, b) =>
colorOrder[a.tagType.tagColor] - colorOrder[b.tagType.tagColor] ||
a.tagType.name.localeCompare(b.tagType.name)
);
console.log(tags);
.as-console-wrapper { max-height: 100% !important; top: 0; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With