Как я могу отсортировать это в JavaScript? - PullRequest
1 голос
/ 06 мая 2010

Я стучу головой по стене, пытаясь понять, как отсортировать это в JavaScript (мне, к сожалению, приходится работать с этим в этом формате).

Мне нужно отсортировать его на основе Small, Medium, Large, XL, XXL (Small ранжирование наивысшего) в каждом поле размера variationValues. Проблема в том, что мне нужно отсортировать variationCosts и variationInventories одновременно, чтобы соответствовать новому порядку (поскольку каждое значение в порядке соответствует значениям в других полях: (

Ввод, с которым я должен работать

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 ]

3 голосов
/ 06 мая 2010

Я думаю, вам понадобится промежуточный массив, в котором вы консолидируете то, что по сути является записью, с полями, распределенными по нескольким массивам, в список объектов.

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

Затем напишите функцию сравнения "size":

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 голос
/ 06 мая 2010

Можете ли вы изменить структуру данных? Было бы проще, если бы вы хранили связанные данные вместе. Например:

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().)

0 голосов
/ 06 мая 2010

Вы должны рассмотреть возможность преобразования этих массивов в один массив объектов / хэшей. Или, в противном случае, вы можете использовать decorate-sort-undecorate pattern . В этом случае вы должны сжать два связанных между собой массива, отсортировать их, а затем распаковать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...