JS Количество случаев в последовательности является простым числом

#javascript #arrays #count #sequence #primes

#язык JavaScript #массивы #считать #последовательность #простые числа

Вопрос:

У меня есть два массива (X и Y), и мне нужно создать массив Z, содержащий все элементы из массива X, кроме тех, которые присутствуют в массиве Y p раз, где p-простое число. Я пытаюсь написать это в JS.

Например:
Массив X: [2, 3, 9, 2, 5, 1, 3, 7, 10]
Массив Y: [2, 1, 3, 4, 3, 10, 6, 6, 1, 7, 10, 10, 10]
Массив Z: [2, 9, 2, 5, 7, 10]

До сих пор у меня есть это:

 const arrX = [2, 3, 9, 2, 5, 1, 3, 7, 10] const arrY = [2, 1, 3, 4, 3, 10, 6, 6, 1, 7, 10, 10, 10] const arrZ = [] const counts = [];  // count number occurrences in arrY for (const num of arrY) {  counts[num] = counts[num] ? counts[num]   1 : 1; }  // check if number is prime const checkPrime = num =gt; {  for (let i = 2; i lt; num; i  ) if (num % i === 0) return false  return true }  console.log(counts[10]); // returns 4  

Любой намек или помощь будут оценены по достоинству. Спасибо!

Комментарии:

1. должно ли это быть в каком-то определенном порядке?

2. Небольшое примечание: вы можете переписать counts[num] = counts[num] ? counts[num] 1 : 1; как counts[num] = counts[num] || 1 (воспользовавшись тем фактом , что undefined выдает ложное значение NaN , а не выдает ошибку).

3. @m.сказал, что да, я хочу сохранить порядок.

4. @RBarryYoung В arrZ Мне нужны все числа, которые есть arrX , кроме тех, которые присутствуют в arrY p раз, где p-простое число. Итак, 2 присутствует в arrY одно время — 1 это не простое число, поэтому я держу и 2 arrX то, и другое внутри arrZ .

Ответ №1:

Ты на правильном пути. counts должен быть объект, отображающий элементы в arrY соответствии с их количеством вхождений. С этим легко справиться reduce .

Основная проверка нуждается в незначительном редактировании, и последним шагом является фильтрация arrX . Предикат фильтра — это просто простая проверка количества для этого элемента.

 // produce an object who's keys are elements in the array // and whose values are the number of times each value appears const count = arr =gt; {  return arr.reduce((acc, n) =gt; {  acc[n] = acc[n] ? acc[n] 1 : 1;  return acc;  }, {}) }  // OP prime check is fine, but should handle the 0,1 and negative cases: const checkPrime = num =gt; {  for (let i = 2; i lt; num; i  ) if (num % i === 0) return false  return num gt; 1; }  // Now just filter with the tools you built... const arrX = [2, 3, 9, 2, 5, 1, 3, 7, 10] const arrY = [2, 1, 3, 4, 3, 10, 6, 6, 1, 7, 10, 10, 10] const counts = count(arrY); const arrZ = arrX.filter(n =gt; checkPrime(counts[n])); console.log(arrZ) 

Комментарии:

1. Хорошо, теперь я удалил эти отфильтрованные элементы, arrX и это работает идеально. Спасибо вам ооочень большое! const arrSolution = arrX.filter(item =gt; !arrZ.includes(item)) console.log(arrSolution) // returns [2, 9, 2, 5, 7, 10]

2. Ах, ты идешь на обратное? Ответьте на те, которые не появляются в прайм-тайм? Проще просто перевернуть условие на фильтре… arrX.filter(n =gt; !checkPrime(counts[n])); . Видишь ! это ?