Задать вопрос
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)
  • Вопрос задан
  • 208 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
Делаем ровно то, что спрошено:

const { length: result } = Array.prototype.filter.call(
  newWord,
  Set.prototype.has.bind(new Set(glas))
);

Или, можно решить задачу в общем виде - сделаем функцию, находящую совпадающие элементы у любых итерируемых объектов. Причём под совпадением будем понимать не обязательно непосредственное равенство (оставим это как вариант по умолчанию), а равенство некоторых производных значений:

function intersection(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]().filter(n => keys.has(getKey(n)));
}

В вашем случае применять так:

const result = intersection(newWord, glas).reduce(acc => ++acc, 0);
// или, без учёта регистра
const result = intersection(newWord, glas, n => n.toLowerCase()).toArray().length;

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

Array.from(intersection(Array(7).keys(), Array(4).keys())) // [0, 1, 2, 3]
[...intersection([ { id: 1 }, { id: 2 } ], [ { id: 2 }, { id: 3 } ], 'id')] // [{id: 2}]
Ответ написан
Комментировать
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
long long long long long .... int
Считаем множественное вхождение букв:
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: Если нужно считать буквы в разном регистре отдельно, требуются изменения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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