Sort array items and preserve order of same elements
Add an extra attribute to the array: order
var array = [
{ name: "border-color", value: "#CCCCCC", order: 1 },
{ name: "color", value: "#FFFFFF", order: 2 },
{ name: "background-color", value: "rgb(0, 0, 0)", order: 3 },
{ name: "background-color", value: "rgba(0, 0, 0, .5)", order: 4 }
];
and then change the sort function to sort on order if the name is equal:
array.sort(function(a, b) {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
if (a.name == b.name) {
if(a.order > b.order) return -1; else return 1;
}
});
Note that the sign of the return for the order has to be tweaked depending on whether you want it sorted increasing or decreasing (here, I assumed you're sorting from largest to smallest, so return the one with the smaller order).
Theoretically before sorting you could keep track of its index in the array and take that into account when sorting.
var sortArray = yourarray.map(function(data, idx){
return {idx:idx, data:data}
})
sortArray.sort(function(a, b) {
if (a.data.name < b.data.name) return -1;
if (a.data.name > b.data.name) return 1;
return a.idx - b.idx
});
var answer = sortArray.map(function(val){
return val.data
});
This changed as of ES2019, Array#sort
is stable, meaning that the two entries with the same name
will have the same position relative to one another as they did before the array was sorted:
22.1.3.27 Array.prototype.sort ( comparefn )
The elements of this array are sorted. The sort must be stable (that is, elements that compare equal must remain in their original order).
(my emphasis)
So in your case, the order of { name: "background-color", value: "rgb(0, 0, 0)" }
and { name: "background-color", value: "rgba(0, 0, 0, .5)" }
will remain the same, because they compare as equal.
Prior to ES2019, the sort wasn't required to be stable, so they could have had their order reversed — or not, depending on the implementation.
Stable sort is broadly supported (not least because most engines already implemented a stable sort, so there was nothing for them to do).