我怎么能用JavaScript对它进行排序?

时间:2010-05-06 04:54:28

标签: javascript sorting

我一直在试图弄清楚如何在JavaScript中对它进行排序(我不得不以这种格式使用它)。

我需要根据每个Small, Medium, Large, XL, XXL尺寸字段中的SmallvariationValues排名最高)对其进行排序。问题是我需要同时对variationCostsvariationInventories进行排序以匹配新订单(因为每个值按顺序对应于其他字段中的值:(

输入我必须使用

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
};

期望的输出

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
};

3 个答案:

答案 0 :(得分:3)

我认为你需要一个中间数组,在这个数组中,你可以整合基本上是一个记录,其中的字段分布在几个数组中,形成一个对象列表。

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]
  });
}

然后写一个“大小”比较函数:

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 }

然后使用sizecmp函数进行“记录”比较功能:

function recordcmp(recA,recB) {
   return sizecmp(recA.size,recB.size);
}

然后:

m._tmpRecordList.sort(recordcmp);

m._tmpRecordList翻译回你所困扰的不幸结构,留给读者练习。 :)

答案 1 :(得分:1)

您可以重新安排数据结构吗?如果将相关数据存储在一起会更容易。例如:

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);
    }
);

(适用于compareSizes()的定义。)

答案 2 :(得分:0)

您应该考虑将这些数组转换为一个对象/哈希数组。或者,如果失败,您可以使用decorate-sort-undecorate pattern。在这种情况下,您可以将两个相关的数组压缩,排序,然后解压缩。