I'm not too good at JS, but have survived thus far. I'm creating a sort-of complex JS object and wanting to sort it. The object's structure looks like this:
cart.attributes = [
{
Attribute,
Value
}
...
];
I'm creating a unique attribute that tells me 3 things separated arbitrarily by a colon:
(Product ID):(Product QTY Iterator):(Attribute's Name)
The product QTY iterator just means, if I have 3 of the same product, which of the 3 am I talking about in terms of the attribute. Each attribute has then a value.
THE PROBLEM As you'll see from the print-out, there's no organization. I'd like to sort these results first by the (Product ID), then the (QTY Iterator), then alphabetically by (Name).
Here's a print out of the object using the following method to print it out, and then the results.
CODE USING TO PRINT RESULTS
$.each(cart.attributes, function(attr, value) {
console.log("Attr: "+attr);
console.log("Value: "+value);
});
RESULTS
«Attr» 46913872:2:Size
«Value» 10
«Attr» 46913872:2:Hollow-to-Hem
«Value» 57"
«Attr» 46913872:1:Hips
«Value» 34"
«Attr» 46913872:2:Bust
«Value» 34"
«Attr» 46913872:2:Dress Color (hex)
«Value» #FFFFFF
«Attr» 46913872:2:Rush Cut
«Value» Super Rush Cut - 6 weeks
«Attr» 46913872:1:Extra Length
«Value» 5"
«Attr» 46913872:2:Hips
«Value» 34"
«Attr» 46913872:1:Waist
«Value» 29"
«Attr» 46913872:2:Waist
«Value» 23"
«Attr» 46913872:2:Dress Color (name)
«Value» White
«Attr» 46913872:1:Rush Cut
«Value» Super Rush Cut - 6 weeks
«Attr» 46913872:1:Sash Color (name)
«Value» Lipstick
«Attr» 46913872:2:Sash Color (hex)
«Value» #000000
«Attr» 46913872:1:Size
«Value» 14
«Attr» 46913872:1:Hollow-to-Hem
«Value» 58"
«Attr» 46913872:1:Bust
«Value» 35"
«Attr» 46913872:1:Sash Color (hex)
«Value» #B6064C
«Attr» 46913872:1:Dress Color (hex)
«Value» #F9C8D0
«Attr» 46913872:1:Dress Color (name)
«Value» Tea Rose
«Attr» 46913872:2:Extra Length
«Value» 5"
«Attr» 46913872:2:Sash Color (name)
«Value» Black
Sort an Array of Objects in JavaScriptTo sort an array of objects, you use the sort() method and provide a comparison function that determines the order of objects.
To define custom sort function, you need to compare first value with second value. If first value is greater than the second value, return -1. If first value is less than the second value, return 1 otherwise return 0. The above process will sort the data in descending order.
const obj = { "CAB": { name: 'CBSSP', position: 2 }, "NSG": { name: 'NNSSP', position: 3 }, "EQU": { name: 'SSP', position: 1 } };
Ok from the comments below I got a clearer picture of what the object is.
Assuming the object looks like this:
cart.attributes = {
'46913872:2:Size' : 10,
'46913872:2:Hollow-to-Hem' : 57
// ...
}
It can't be sorted since it's not an Array. But you can sort it out for printing.
In plain old javascript you can do:
// First get all keys:
var keys = [];
for (var n in cart.attributes) {
if (cart.attributes.hasOwnProperty(n)) {
keys.push(n);
}
}
// now sort the keys:
keys.sort(function(a,b){
attr_a = a.split(':');
attr_b = b.split(':');
// sort by product ID:
if (parseInt(attr_a[0],10) < parseInt(attr_b[0],10)) return -1;
if (parseInt(attr_a[0],10) > parseInt(attr_b[0],10)) return 1;
// sort by quantity:
if (parseInt(attr_a[1],10) < parseInt(attr_b[1],10)) return -1;
if (parseInt(attr_a[1],10) > parseInt(attr_b[1],10)) return 1;
// finally sort by name:
if (attr_a[2] < attr_b[2]) return -1;
if (attr_a[2] > attr_b[2]) return 1;
return 0;
})
// now print out the object in key-sorted-order:
for (var i=0; i<keys.length; i++) {
console.log("Attr: "+keys[i]);
console.log("Value: "+cart.attributes[keys[i]]);
}
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