Как я могу удалить точное количество повторяющихся значений из массива в JS?

Здесь у меня есть массив из 5 чисел, из которых 3 (или более) одинаковы: [1,1,4,2,1].

Как я могу получить только два других числа из массива (в данном примере [4,2])?

Вот несколько тестовых примеров:

[1,1,4,2,1] => [4,2] or [2,4]
[5,5,1,5,5] => [1,5] or [5,1]
[3,4,3,4,3] => [4,4]
[6,6,6,6,6] => [6,6]

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

function getUniques(arr) {
  const counts = {};
  arr.forEach(num => {counts[num] = (counts[num]||0) + 1});
  const uniques = [];
  Object.keys(counts).forEach(n => {
    if (counts[n] === 1)
      uniques.push(Number(n));
  });
  return uniques;
}
console.info(getUniques([1,4,2,1,1])) // [2,4]
console.info(getUniques([6,3,3,6,6])) // []
console.info(getUniques([5,3,5,5,5])) // [3]
console.info(getUniques([4,4,4,4,4])) // []

разве ваш результат из третьего примера не должен быть просто [3]? трудно понять, чего именно вы хотите, а также ваша попытка отсутствует

Chris G 07.03.2024 15:58

Должен ли сохраняться какой-то порядок, может ли решение для второго также быть [5,1]?

trincot 07.03.2024 15:59

В случае [1,1,4,2,1] → [4,2] вы удалили первые три дубликата. В [1,5,1,1,1] → [1,5] вы удалили последние три дубликата.

Parzh from Ukraine 07.03.2024 16:01

@ParzhfromUkraine Нет, в первом случае были удалены три последних дубликата.

jabaa 07.03.2024 16:04

Подсчитайте количество вхождений по модулю 3 в объекте или карте и создайте массив результатов с новыми значениями.

jabaa 07.03.2024 16:05

@jabaa Ах, окей, согласен

Parzh from Ukraine 07.03.2024 16:06

вау, сообщество stack overflow такое милое и полезное 😊 оно дает мне повод жить

absolutely not the the 07.03.2024 16:23

Готовы помочь. Можете ли вы прояснить те моменты, которые были подняты выше? Поможет ли вам вклад Джабаа решить проблему?

trincot 07.03.2024 16:27

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

absolutely not the the 07.03.2024 16:36

Ах, я вижу требование, чтобы входные данные всегда имели размер 5.

trincot 07.03.2024 16:42

@trincot, меня это не беспокоит - я знаю, что во входных данных будет как минимум 3 одинаковых числа

absolutely not the the 07.03.2024 16:45

Хорошо, я проголосовал за возобновление вопроса — да, важно немедленно реагировать на комментарии, которые вы получаете после публикации ,-)

trincot 07.03.2024 16:46

Снова открыл вопрос. На самом деле это первый вопрос, который, как я видел, был открыт повторно.

Parzh from Ukraine 08.03.2024 10:20
Поведение ключевого слова "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) для оценки ваших знаний,...
3
13
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете перебирать массив, чтобы поддерживать счетчик для каждого уникального значения. Для этой цели вы можете использовать Map или простой предмет. Но вместо обычного счетчика сделайте это по модулю 3:

function removedTriplets(arr) {
  const counter = {};
  for (const value of arr) counter[value] = ((counter[value] || 0) + 1) % 3;
  return arr.filter(value => counter[value]-- > 0);
}

const tests = [
  [1,1,4,2,1],
  [1,5,1,1,1], 
  [3,3,3,3,3],
  [8,9,8,9,8],  
];

for (const arr of tests) {
    console.info(JSON.stringify(arr), "=>", JSON.stringify(removedTriplets(arr)));
}

это гениально, спасибо

absolutely not the the 10.03.2024 16:26

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

function removeThreeDuplicates(inputs) {
  const inputCopy = inputs.slice()
  const occurrences = Object.create(null)

  for (const [index, input] of inputCopy.entries()) {
    occurrences[input] ??= []
    occurrences[input].push(index)
  }

  for (const indexes of Object.values(occurrences)) {
    if (indexes.length >= 3) {
      const indexesToDelete = indexes.slice(0, 3)

      for (const index of indexesToDelete.reverse()) {
        inputCopy.splice(index, 1)
      }

      return inputCopy
    }
  }

  throw new Error('Unexpected input, expected an array of five numbers and three duplicates')
}

console.info(removeThreeDuplicates([1, 1, 4, 2, 1])) // => [4, 2]
console.info(removeThreeDuplicates([5, 5, 1, 5, 5])) // => [1, 5]
console.info(removeThreeDuplicates([3, 4, 3, 4, 3])) // => [4, 4]
console.info(removeThreeDuplicates([6, 6, 6, 6, 6])) // => [6, 6]

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