Сортировать массив JavaScript в искусственном порядке - PullRequest
0 голосов
/ 20 октября 2018

У меня есть массив, возвращенный запросом REST, который представляет количество элементов в многоэтапном производственном процессе.

var steps = [
  { name:'Package', value:3},
  { name:'Assemble', value:1 },
  { name:'Ship', value:7},
  { name:'Preprocess', value:9 },
  { name:'Paint', value:5 }
];

Я бы хотел отсортировать их в порядке процессаПримерно так:

  1. Предварительная обработка
  2. Краска
  3. Сборка
  4. Упаковка
  5. Корабль

У меня есть другие буквенно-цифровые сорта, которые я делаю с Underscore, но я не могу понять это.

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Вы можете создать объект, который упоминает приоритет каждого имени при заказе.

let priority = {
  Preprocess: 1,
  Paint: 2,
  Assemble: 3,
  Package: 4,
  Ship: 5,
}

var steps = [
  { name:'Package', value:3},
  { name:'Assemble', value:1 },
  { name:'Ship', value:7},
  { name:'Preprocess', value:9 },
  { name:'Paint', value:5 }
];

const result = steps.sort((a,b) => priority[a.name] - priority[b.name]);

console.log(result);
0 голосов
/ 20 октября 2018

Я просто использую карту приоритетов для каждого типа шага, чтобы использовать ее в функции сравнения.

var steps = [
    { name: 'Package', value: 3 },
    { name: 'Assemble', value: 1 },
    { name: 'Ship', value: 7 },
    { name: 'Preprocess', value: 9 },
    { name: 'Paint', value: 5 }
];
var stepPrecedenceMap = new Map([["Preprocess", 1], ["Paint", 2], ["Assemble", 3], ["Package", 4], ["Ship", 5]])

console.log(
steps.sort((stepA, stepB) => {  
return stepPrecedenceMap.get(stepA.name) - stepPrecedenceMap.get(stepB.name)
}));
0 голосов
/ 20 октября 2018

Вы можете взять объект для требуемого ордера с числовыми значениями для позиции.Затем сортируйте по этим значениям.

var steps = [{ name: 'Package', value: 3 }, { name: 'Assemble', value: 1 }, { name: 'Ship', value: 7 }, { name: 'Preprocess', value: 9 }, { name: 'Paint', value: 5 }],
    order = { Preprocess: 1, Paint: 2, Assemble: 3, Package: 4, Ship: 5 };
    
steps.sort(({ name: a }, { name: b }) => order[a] - order[b]);

console.log(steps);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...