Tishaa
@Tishaa

Как посчитать количество пересечений с помощью метода filter?

Вот есть код, выводит число 3 в консоль, суть в том, что код проверяет, сколько букв из переменной newWord находится в переменной glas. Как упростить код с помощью метода filter?

const newWord = 'JavaScript';

let glas = ['a','e','i','o','u']

function as(a,b){
    count = 0
    for(i=0;i< a.length; i++){
        for(j=0;j <b.length;j++){
            if(a[i] == b[j]){
                count++
            }
        }
    }
    return count;
}

console.log(as(newWord,glas))

as(newWord,glas)
  • Вопрос задан
  • 170 просмотров
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
Решим задачу в общем виде - сделаем функцию, находящую количество совпадающих элементов у любых итерируемых объектов. Причём под совпадением будем понимать не обязательно непосредственное равенство (оставим это как вариант по умолчанию), а равенство некоторых производных значений. Так что к чёрту filter (а ещё Safari - говорят, яблочные уроды пока не реализовали поддержку методов итераторов; впрочем, сделать обычный for...of вместо reduce не проблема):

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);
}

В вашем случае применять так: const result = countIntersections(newWord, glas);.

Другие примеры использования:

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
Ответ написан
Комментировать
IvanU7n
@IvanU7n
nothing interesting here
const as = (where, what) => what.filter(v => where.includes(v)).length;


не слишком «просто»? вопросов, что делает этот код, не будет?

ПЛЮС: код выводит количество букв из what, один только Array.filter() не даст количества вхождений в where букв из what

ПЛЮС2: то самое упрощение, дающее количество вхождений и где одним только Array.filter() не обойтись:
const as = (where, what) => where.split('').filter(v => what.includes(v)).length;
Ответ написан
@historydev Куратор тега 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));


P.S: Если нужно считать буквы в разном регистре отдельно, требуются изменения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы