I've been pounding my head on the wall trying to figure out how to sort this in JavaScript (I have to work with it in this format unfortunately).
I need to sort it based on Small, Medium, Large, XL, XXL
(Small
ranking the highest) in each variationValues
size field. The problem is that I need to sort the variationCosts
and variation开发者_如何学运维Inventories
at the same time to match the new order (since each value in order corresponds to the values in the other fields :(
Input I have to work with
var m = {
variationNames: ["Length", "Size" ],
variationValues: [
["26.5\"", "XXL"],
["25\"", "Large"],
["25\"", "Medium"],
["25\"", "Small"],
["25\"", "XL"],
["25\"", "XXL"],
["26.5\"", "Large"],
["26.5\"", "Small"],
["26.5\"", "XL"]
],
variationCosts: [
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00
],
variationInventories: [
10,
60,
51,
10,
15,
10,
60,
10,
15
],
parentCost: 20.00
};
Desired output
var m = {
variationNames: ["Length", "Size" ],
variationValues: [
["25\"", "Small"],
["26.5\"", "Small"],
["25\"", "Medium"],
["25\"", "Large"],
["26.5\"", "Large"],
["25\"", "XL"],
["26.5\"", "XL"]
["25\"", "XXL"],
["26.5\"", "XXL"],
],
variationCosts: [
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00,
20.00
],
variationInventories: [
10,
10,
51,
60,
15,
15,
15,
10,
10
],
parentCost: 20.00
};
I think you're going to need an intermediate array where you consolidate what's essentially a record with its fields spread across a few arrays into a list of objects.
m._tmpRecordList = [];
for(var i=0, z=m.variationValues.length; i<z; i++) {
m._tmpRecordList.push({
length: m.variationValues[i][0],
size: m.variationValues[i][1],
cost: m.variationCosts[i],
inventories: m.variationInventories[i]
});
}
Then write a "size" comparison function:
function sizecmp(sizeA,sizeB) {
var nA = sizecmp.table[sizeA], nB = sizecmp.table[sizeB];
if(nA == nB)
return 0;
else if(nA < nB)
return -1;
else if(nA > nB)
return 1;
else
throw "bad size value passed to sizecmp";
}
sizecmp.table = { Small: 5, Medium: 4, Large: 3, XL: 2, XXL: 1 }
And then a "record" comparison function using the sizecmp function:
function recordcmp(recA,recB) {
return sizecmp(recA.size,recB.size);
}
And then:
m._tmpRecordList.sort(recordcmp);
Translating m._tmpRecordList
back to the unfortunate structure you're stuck with is left as an exercise for the reader. :)
Can you rearrange your data structure? It would be easier if you stored the related data together. For example:
var variations = [
{ length: '25"', size: "Small", cost: 20.00, inventory: 10 },
{ length: '26.5"', size: "Small", cost: 20.00, inventory: 10 },
{ length: '25"', size: "Medium", cost: 20.00, inventory: 51 },
{ length: '25"', size: "Large", cost: 20.00, inventory: 60 },
{ length: '26.5"', size: "Large", cost: 20.00, inventory: 15 },
{ length: '25"', size: "XL", cost: 20.00, inventory: 15 },
{ length: '26.5"', size: "XL", cost: 20.00, inventory: 15 },
{ length: '25"', size: "XXL", cost: 20.00, inventory: 10 },
{ length: '26.5"', size: "XXL", cost: 20.00, inventory: 10 }
];
variations.sort(
function(v1, v2) {
return compareSizes(v1.size, v2.size);
}
);
(For a suitable definition of compareSizes()
.)
You should consider turning those arrays into one array of objects/hashes. Or, failing that, you can use the decorate-sort-undecorate pattern. In this case, you would zip your two related arrays together, sort them, and then unzip them.
精彩评论