#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]));
. Видишь!
это ?