Сортировать массив объектов по списку заданных значений массива в JavaScript - PullRequest
0 голосов
/ 27 марта 2020

У меня есть массив объектов, таких как:

[
    { hour: "08:00" },
    { hour: "08:30" },
    { hour: "09:00" },
    { hour: "09:30" },
    { hour: "10:00" },
]

и список "приоритетов":

[
    "09:00",
    "09:30",
    "12:00" // Yes, it doesn't exist in array of available hours
]

Я хотел бы получить вывод функции:

[
    { hour: "09:00" },
    { hour: "09:30" },
    { hour: "08:00" },
    { hour: "08:30" },
    { hour: "10:00" },
]

Я думаю, что мог бы использовать .sort с собственной функцией сравнения в JavaScript, но я понятия не имею, как мне вообще начать с этой проблемой.

Я буду благодарен за любые советы по решению моей проблемы.

Ответы [ 4 ]

1 голос
/ 27 марта 2020

Разве простой sort(), как тот, что ниже, делает работу?

const arr = [{hour:"08:00"},{hour:"08:30"},{hour:"09:00"},{hour:"09:30"},{hour:"10:00"}],
      priority = ["09:00","09:30","12:00"],
      
      sorted = arr.sort(({hour:hourA},{hour:hourB}) =>
        !priority.includes(hourA) ?
        1 :
        !priority.includes(hourB) ?
        -1 :
        priority.indexOf(hourA) - priority.indexOf(hourB)
      )
      
console.log(sorted)
.as-console-wrapper{min-height:100%;}
1 голос
/ 27 марта 2020

Проверьте, есть ли он в списке, если он есть, сортируйте по нему, если не сортируйте по часам.

var data = [
  { hour: "08:00" },
  { hour: "12:00" },
  { hour: "08:30" },
  { hour: "09:00" },
  { hour: "09:30" },
  { hour: "10:00" },  
]

var priorities = [
  "09:00",
  "09:30",
  "12:00" 
]

var sorted = data.sort (function (a,b) {
  var aH = a.hour
  var bH = b.hour
  var aIndex = priorities.indexOf(aH)
  var bIndex = priorities.indexOf(bH)
  /* if both are priorities sort by index */
  if (aIndex > -1 && bIndex > -1) {
    return aIndex === bIndex ? 0 : aIndex > bIndex ? 1 : -1
  } else if (aIndex > -1) { // if a in priority, move up
    return -1
  } else if (bIndex > -1) { // if b in priority, move up
    return 1
  } else { // if not priorities, sort by string
    return aH.localeCompare(bH)
  }
})

console.log(sorted)
1 голос
/ 27 марта 2020

вы можете сделать это с сортировкой в ​​одном go ... с обратным списком приоритетов, чтобы упростить его ... т.е. самый высокий приоритет имеет самый высокий indexOf, а все, что не в списке, имеет приоритет -1

const data = [
    { hour: "08:00" },
    { hour: "08:30" },
    { hour: "09:00" },
    { hour: "09:30" },
    { hour: "10:00" },
]

const priorities = [
    "09:00",
    "09:30",
    "12:00" // Yes, it doesn't exist in array of available hours
];
const reverse = priorities.slice().reverse();

let result = data.sort((a, b) => {
    prioritya = reverse.indexOf(a.hour);
    priorityb = reverse.indexOf(b.hour);
    if (prioritya === priorityb) {
        return a.hour.localeCompare(b.hour);
    }
    return priorityb - prioritya;
});
console.log(result);
0 голосов
/ 27 марта 2020

Вы можете взять объект с индексами для priorities и взять для неизвестных свойств Number.MAX_VALUE.

var data = [{ hour: "08:00" }, { hour: "08:30" }, { hour: "09:00" }, { hour: "09:30" }, { hour: "10:00" }],
    priorities = ["09:00", "09:30", "12:00"],
    order = priorities.reduce((r, hour, i) => (r[hour] = i + 1, r), {});

data.sort(({ hour: a }, { hour: b }) =>
    (order[a] || Number.MAX_VALUE) - (order[b] || Number.MAX_VALUE));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...