Есть ли лучший способ переключения существования элемента внутри массива?

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

const onDateSelected = function (date) {
  const inArray = selectedDates.value.find((d) => d === date) !== undefined;
  if (inArray) {
    selectedDates = selectedDates.filter((d) => d !== date);
  } else {
    selectedDates.push(date);
  }
};

Есть ли более короткий/быстрый способ сделать это?

Привет! Это обязательно должен быть массив или может быть набор ? Наборы гораздо лучше подходят для тех операций, которые вам нужны.

Armen Michaeli 11.06.2024 17:28

Если вы собираетесь часто использовать это, то сделайте это функцией или расширением массива (большинство людей не рекомендуют этого делать), тогда вы можете сделать что-то вроде toggleArrayItem(selectedDate, date), что, вероятно, будет самым коротким из возможных вариантов. Фактическая реализация тогда не обязательно должна быть «короткой» — да, эффективной, но символы кода не будут иметь значения, поскольку вы пишете его только один раз.

fdomn-m 11.06.2024 17:32

@fdomn-m да, я бы рекомендовал это сделать. Сделайте это функцией. Сделанный. Тогда вам не придется иметь дело с последствиями изменения встроенных модулей.

VLAZ 11.06.2024 17:32
Поведение ключевого слова "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
3
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать это:

const onDateSelected = function(date) {
  const index = selectedDates.indexOf(date);
  index !== -1 ? selectedDates.splice(index, 1) : selectedDates.push(date);
};
Ответ принят как подходящий

Использование набора значительно упрощает задачу, используя имеет , удалить и добавить:

const data =  new Set([ 'foo', 'bar', 'foobar' ]);
const removeOrAdd = 'bar';

if (data.has(removeOrAdd)) {
    data.delete(removeOrAdd)
} else {
    data.add(removeOrAdd)
}

console.info([...data]);

Если вам действительно нужен массив, рассмотрите возможность использования indexOf в сочетании с splice

const data = [ 'foo', 'bar', 'foobar' ];
const removeOrAdd = 'bar';

const possibleIndex = data.indexOf(removeOrAdd);

if (possibleIndex > -1) {
    data.splice(possibleIndex, 1);
} else {
    data.push(removeOrAdd);
}

console.info(data);

Верно, но поскольку оп использует find((d) => d === date), я предполагаю, что он использует необъектные массивы.

0stone0 11.06.2024 17:36

Да, каким-то образом я прочитал вопрос три раза и каждый раз читал это как поиск объекта :/ Я бы винил в этом жару. Set здесь имеет смысл.

VLAZ 11.06.2024 17:36

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