У меня есть следующий массив с тремя элементами:
const tasks = [{
type: 'critical',
value: 'production issue',
}, {
type: 'high',
value: 'server down'
}, {
type: 'medium',
value: 'backup not taken'
}];
Теперь я объявляю пустой массив, который должен возвращать элемент в зависимости от приоритета.
let priorityTask = [];
Теперь приоритетная задача должна вернуться { type: 'critical', value: 'production issue' }, поскольку критический тип будет иметь наивысший приоритет.
Если критический тип недоступен в массиве задач, он должен вернуть { type: 'high', value: 'server down' }, поскольку высокий тип будет иметь второй приоритет и тому подобное.
Я написал следующий код, чтобы получить результат, который выглядит нормально. Но если у нас большой набор задач? как мы можем реорганизовать код, чтобы сделать его лучше.
Порядок приоритета: Критический – Высокий – Средний.
const criticalIndex = tasks.findIndex((task) => task.type === 'critical');
const highIndex = tasks.findIndex((task) => task.type === 'high');
const mediumIndex = tasks.findIndex((task) => task.type === 'medium');
tasks.forEach((task) => {
if (criticalIndex >= 0) {
task.type === 'critical' ? priorityTask = task : [];
} else {
if (highIndex >= 0) {
task.type === 'high' ? priorityTask = task : [];
} else {
if (mediumIndex >= 0) {
task.type === 'medium' ? priorityTask = task : [];
}
}
}
});
console.info('priorityTask: ', priorityTask);
{
type: 'critical',
value: 'production issue'
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете упростить и обобщить код, используя массив приоритетов, определяющий порядок приоритетов для типов задач. Вот как вы можете выполнить рефакторинг кода:
const tasks = [
{ type: 'critical', value: 'production issue' },
{ type: 'high', value: 'server down' },
{ type: 'medium', value: 'backup not taken' },
];
const priority = ['critical', 'high', 'medium'];
let priorityTask = tasks.find(task => priority.includes(task.type));
console.info('priorityTask:', priorityTask);
В этом рефакторинговом коде массив priority определяет порядок приоритета типов задач. Метод find используется для поиска первой задачи в массиве tasks, тип которой включен в массив priority. Такой подход делает код более масштабируемым и простым в обслуживании, особенно если у вас больший набор типов задач.
const priority = ['critical', 'high', 'medium'];
let priorityTask = priority.map(p => tasks.find(task => task.type === p)).find(task => task !== undefined);
console.info('priorityTask:', priorityTask);
Используя массив priority, мы определяем своего рода иерархию, и find вернет первое вхождение, то есть желаемый результат.
мы могли бы просто заменить find(task => Task !== undefined) на [0], так как первый элемент, возвращаемый после карты, всегда будет тем, который соответствует первому элементу в массиве приоритетов.
let PriorityTask = Priority.map(p => Tasks.find(Task => Task.type === P))[0]
Существует несколько подходов к вашему решению, и я не могу точно определить ваши требования, поэтому у меня есть несколько подходов, которыми я могу поделиться.
Поскольку вам нужно было решение для большого набора, я сейчас изменил массив задач.
const tasks = [
{ type: 'medium', value: 'backup not taken - 2' },
{ type: 'critical', value: 'production issue - 1' },
{ type: 'medium', value: 'backup not taken - 1' },
{ type: 'high', value: 'server down - 2' },
{ type: 'high', value: 'server down - 1' },
{ type: 'critical', value: 'production issue - 2' },
];
Метод 1. Если вам нужны только критически важные задачи, задачи высокого или среднего уровня.
const getTasks = (type) => {
return tasks.filter(task => task.type === type);
}
console.info(getTasks('critical'));
//[
// { type: 'critical', value: 'production issue - 1' },
// { type: 'critical', value: 'production issue - 2' }
//]
console.info(getTasks('high'));
//[
// { type: 'high', value: 'server down - 2' },
// { type: 'high', value: 'server down - 1' }
//]
Метод 2: получить задачу с самым высоким рейтингом и удалить ее из массива.
const priorityOrder = ['critical', 'high', 'medium'];
const getHighestPriorityTask = () => {
if (tasks.length === 0) {
return undefined;
}
let task;
for (let i = 0; i < priorityOrder.length; i++) {
task = tasks.find(task => task.type === priorityOrder[i]);
if (task) {
tasks.splice(tasks.indexOf(task), 1);
return task;
}
}
return undefined;
}
console.info(getHighestPriorityTask());//{ type: 'critical', value: 'production issue - 1' }
console.info(getHighestPriorityTask());//{ type: 'critical', value: 'production issue - 2' }
console.info(getHighestPriorityTask());//{ type: 'high', value: 'server down - 2' }
console.info(getHighestPriorityTask());//{ type: 'high', value: 'server down - 1' }
console.info(getHighestPriorityTask());//{ type: 'medium', value: 'backup not taken - 2' }
console.info(getHighestPriorityTask());//{ type: 'medium', value: 'backup not taken - 1' }
console.info(getHighestPriorityTask());//undefined
Метод 3. Вы даже можете отсортировать его в последовательности критический > высокий > средний.
const sortedTasks = tasks.sort((a, b) => {
const priorityOrder = ['critical', 'high', 'medium'];
const priorityA = priorityOrder.indexOf(a.type);
const priorityB = priorityOrder.indexOf(b.type);
return priorityA - priorityB;
});
console.info(sortedTasks);
Надеюсь, поможет !!
Спасибо за быстрый ответ, но это не даст необходимого результата. например, если у нас есть следующий массив задач const Tasks = [ { type: 'high', value: 'server down' }, { type: 'critical', value: 'production Issue' }, { type: 'medium', значение: 'резервная копия не сделана' }, ]; он вернет { тип: 'высокий', значение: 'сервер не работает' } но результат должен быть { тип: 'критический', значение: 'производственная проблема' } Приоритет должен быть Критический - Высокий - Средний