Аналитика пользователей

Может кому пригодится решение

Summary
var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

for(var i = 0; i < usersData.length; i++) {
  if(usersData[i].indexOf(query) >= 0) {
    matchingUsers++;
    }
  }
3 лайка

Подскажите:
пишу if (usersData[i].indexOf(query) >= 0 - программа говорит синтаксическая ошибка на этой строке. в каком месте?

Забыли закрывающую скобку после 0

Условие написал через “не равно”:

   if (usersData[i].indexOf(query) !== -1) {...}
3 лайка
var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

matchingUsers = usersData.filter((item) => item.indexOf(query) !== -1).length;
1 лайк

Мой вариант :smirk_cat:

Аналитика пользователей
console.log('Программа "Аналитика пользователей" by Nerealist');

var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

console.log('Массив данных пользователей: ' + usersData + '. Критерий - ' + query);

for (var i = 0; i < usersData.length; i++) {
  if (usersData[i].indexOf(query) > -1) {
    matchingUsers++;
  }
}

console.log('Кол-во подходящих пользователей под заданные критерии : ' + matchingUsers);
2 лайка
var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

for (var i = 0; i <= usersData.length - 1; i++) {
  if (usersData[i].indexOf(query) > -1) {
      matchingUsers++;
  }
}
var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

for (var i = 0; i < usersData.length; i++) {
 if (usersData[i].indexOf(query) != -1) {
   matchingUsers++;
 }
}

Хай,

кто может пояснить, почему результаты, кроме первой итерации = 0?

Задачу я решил, мне не понятна логика…
for (var i = 0; i < usersData.length; i++){
if(usersData[i].indexOf(query) > 1){matchingUsers+=1}
}

не итерации, а теста
и код неправильно написан

в цикле вы перебираете элементы массива
у элемента массива вы спрашиваете: значение содержит подстроку query на позициях 2+?
если да, увеличивается счетчик matchingUsers (бтв, в случае с +1 используют инкремент, если чо).

0 вам выдает, потому что в счетчик не попало совпадений на позициях больше 1.

вообще метод indexOf возвращает -1 если не найдено совпадений, а если найдено, то от 0, а не 2.

поэтому код должен быть таким:

for (var i = 0; i < usersData.length; i++) {
  if (usersData[i].indexOf(query) > -1) {matchingUsers++}
}

или

for (var i = 0; i < usersData.length; i++) {
  if (usersData[i].indexOf(query) >= 0) {matchingUsers++}
}

или

for (var i = 0; i < usersData.length; i++) {
  if (~usersData[i].indexOf(query)) {matchingUsers++}
}
1 лайк

Оооо… А вас, Штирлиц, я попрошу остаться)))

не понятно…так совпадения были на позициях после 1, почему их не считает?

за инкремент, спасиб, если чо)))

да, совпадения по задумке авторов курса были, ваш код на них не срабатывал.
потому что вы указали в сравнении usersData[i].indexOf(query) > 1
indexOf(arg) возвращает первую позицию в массиве, где есть искомый аргумент (он же подстрока).
этот же метод может быть применим к строке (а usersData[i] является строкой).
т.е. метод обращается не к массиву, а строке (как массиву строковых данных). рассмотрим случай из теста, который не попал в счетчик:

[“Людмила Сергеевна”,“Мария Петровна”,“Валерия Брониславовна”,“Елена Васильевна”,“Людмила Львовна”,“Елена Сергеевна”,“Екатерина Максимовна”]
ищем Елену. вот вы как человек посчитайте, скок тут Елен? элемент 4 и 6, их индексы 3 и 5 соотвественно. Но нам это не важно. Рассмотрим usersData[3] = “Елена Васильевна”. Эта строка как бы рассматривается методом indexOf как массив. [“Е”, “л”, “е”, “н”, “а”, " ", “В”, “а”, “с”, “и”, “л”, “ь”, “е”, “в”, “н”, “а”]
Ищем вхождение подстроки Елена в этот “массив”. Ага, Елена нашлась в элементе с индексом 0.
Но вы же указали > 1, а значит строка не может начинаться на Елена (по-вашему), хотя если бы было “Павлова Елена”, то вполне нашлось бы (бтв, не нашлось бы еще в “ХЕлена Джоновна”).
Итак, все элементы исходного массива, которые начинаются на Елена, не попадают в выборку (а должны ваще-то).

3 лайка
Сводка
const findRepeatingElements = [...usersData].reduce((acc, item) => {
  if (item.includes(query)) {
    acc++;
  }

  return acc;
}, 0);

matchingUsers = findRepeatingElements;

А что в 3-м случае означает знак тильда?!

Оператор ~ в JavaScript является оператором побитового НЕ
Тильда получила наиболее широкое применение при поиске значения в массиве
Подробнее тут

2 лайка

Спасибо :+1:

for (var i = 0; i <= usersData.length -1; i++) {

if (usersData[i].indexOf(query) >= 0) {
matchingUsers ++;
}

}

Я так сделал

var usersData = ['Виталий Иванович', 'Иннокентий Петрович', 'Александр Александрович', 'Игорь Олегович', 'Евгений Петрович', 'Игнат Денисович', 'Сергей Александрович', 'Семён Петрович'];
var query = 'Александрович';
var matchingUsers = 0;

for(var i = 0; i < usersData.length; i++){
  if(usersData[i].indexOf(query) != -1){
    matchingUsers += 1;
  }
}

console.log(matchingUsers);
Мое решение
var matchingUsers = 0;

for (var i = 0; i <= usersData.length - 1; i++) {
  var item = usersData[i];
  if (item.indexOf(query) >= 0) {
    matchingUsers++;
    }
}

var usersData = [‘Виталий Иванович’, ‘Иннокентий Петрович’, ‘Александр Александрович’, ‘Игорь Олегович’, ‘Евгений Петрович’, ‘Игнат Денисович’, ‘Сергей Александрович’, ‘Семён Петрович’];
var query = ‘Александрович’;
var matchingUsers = 0;

for (var i = 0; i < usersData.length; i++ ) {
if (usersData[i].indexOf(query) > -1) {
matchingUsers ++;
}
}
console.log(matchingUsers);