Как можно упростить данный код, который выводит число 3 в консоль, с использованием метода filter? Код проверяет количество букв из массива `glas`, которые присутствуют в строке `newWord`. Я пытался сделать это сам, но не смог разобраться.
Для упрощения кода с использованием метода `filter`, можно использовать следующий подход. Предположим, что у вас есть массив гласных букв `glas` и строка `newWord`. Вам необходимо посчитать, сколько гласных букв содержится в `newWord`. Вы можете сделать это с помощью метода `filter` для создания нового массива, содержащего только гласные из `newWord`, а затем просто получить длину этого массива. Вот пример кода: ```javascript const glas = ['a', 'e', 'i', 'o', 'u', 'y']; const newWord = 'hello world'; // Разбиваем строку на массив букв и фильтруем по массиву гласных const count = Array.from(newWord).filter(letter => glas.includes(letter.toLowerCase())).length; console.log(count); // Выводит 3 ``` ### Объяснение: 1. `Array.from(newWord)` - разбивает строку `newWord` на массив её символов. 2. `filter(letter => glas.includes(letter.toLowerCase()))` - фильтрует эти буквы, оставляя только те, которые находятся в массиве `glas`. Используется `toLowerCase()`, чтобы сделать проверку нечувствительной к регистру. 3. `length` - возвращает количество элементов в отфильтрованном массиве, то есть количество гласных. Таким образом, вы получаете число гласных букв в `newWord` с помощью метода `filter`.
<pre><code class="javascript">const as = (where, what) => what.filter(v => where.includes(v)).length;</code></pre> <br/> <br/> не слишком «просто»? вопросов, что делает этот код, не будет? <br/> <br/> ПЛЮС: код выводит <b>количество букв из <code>what</code></b> , один только <code>Array.filter()</code> не даст <b>количества вхождений в <code>where</code> букв из <code>what</code></b> <br/> <br/> ПЛЮС2: то самое упрощение, дающее количество вхождений и где одним только <code>Array.filter()</code> не обойтись: <br/> <pre><code class="javascript">const as = (where, what) => where.split('').filter(v => what.includes(v)).length;</code></pre>
Считаем множественное вхождение букв: <br/> <pre><code class="javascript">const newWord = 'JavaScript';
let glas = ['a','e','i','o','u'];
const lettersCount = (word, letters) =>
word.toLowerCase().split('').reduce((a, l) => (letters.includes(l) && (a[l] = (a[l] ?? 0) + 1), a), {});
console.log(lettersCount(newWord, glas));</code></pre> <br/> <br/> P.S: Если нужно считать буквы в разном регистре отдельно, требуются изменения.
К чёрту filter (а ещё Safari - говорят, яблочные уроды пока не реализовали поддержку методов итераторов; впрочем, сделать обычный for..of вместо reduce не проблема): <br/> <br/> <pre><code class="javascript">function countIntersections(data1, data2, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set(Array.from(data2, getKey));
return data1[Symbol.iterator]().reduce((acc, n) => acc + keys.has(getKey(n)), 0);
}</code></pre> <br/> В вашем случае применять так: <code class="javascript">const result = countIntersections(newWord, glas);</code> . <br/> <br/> Другие примеры использования: <br/> <br/> <pre><code class="javascript">countIntersections(Array(7).keys(), Array(4).keys()) // 4
countIntersections('abCdE', 'ACe', n => n.toLowerCase()) // 3
countIntersections([ { id: 1 }, { id:2 }, { id: 3 } ], [ { id: 3 } ], 'id') // 1</code></pre>