Эффективный способ вернуть один элемент по приоритету в массиве объектов javascript

У меня есть следующий массив с тремя элементами:

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'
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете упростить и обобщить код, используя массив приоритетов, определяющий порядок приоритетов для типов задач. Вот как вы можете выполнить рефакторинг кода:

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 Tasks = [ { type: 'high', value: 'server down' }, { type: 'critical', value: 'production Issue' }, { type: 'medium', значение: 'резервная копия не сделана' }, ]; он вернет { тип: 'высокий', значение: 'сервер не работает' } но результат должен быть { тип: 'критический', значение: 'производственная проблема' } Приоритет должен быть Критический - Высокий - Средний

dvln 08.04.2024 11:21
Ответ принят как подходящий
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], так как первый элемент, возвращаемый после карты, всегда будет тем, который соответствует первому элементу в массиве приоритетов.

dvln 08.04.2024 11:58

let PriorityTask = Priority.map(p => Tasks.find(Task => Task.type === P))[0]

dvln 08.04.2024 12:06

Существует несколько подходов к вашему решению, и я не могу точно определить ваши требования, поэтому у меня есть несколько подходов, которыми я могу поделиться.

Поскольку вам нужно было решение для большого набора, я сейчас изменил массив задач.

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

Надеюсь, поможет !!

Другие вопросы по теме

Группировка Json с одинаковым значением ключа с помощью Jolt
Как превратить динамически распределенный массив C в массив Numpy и вернуть его в Python в модуле расширения C
Распечатайте данные трехмерного массива в виде HTML-таблицы временных диапазонов в день
Почему повторяющиеся элементы в массиве SwiftUI вызывают предупреждение?
Почему выражение с запятой, используемое в качестве размера массива, должно быть заключено в круглые скобки, если оно является частью декларатора массива?
Эффективный способ найти сумму наибольших элементов x в подмассиве
Инициализируйте двумерный массив значениями, указанными в таблице ниже
Как в этом случае получить возвращаемое значение безопасной для типа функции?
Как я могу ввести баллы в массив внутри функции, прервать цикл ввода, используя -1, и использовать массив для поиска баллов = 100?
Разделение данных с помощью PowerShell