@ivan8597

Интересная задача на js?

Добрый день, пожалуйста помогите разобраться с задачей
Написать функцию которая будет возвращать имя счастливчика, того кто чаще всего встречается в массиве let names=['Женя','Женя', 'Иван', 'Женя', 'Виктор', 'Виктор','Константин', 'Виктор', 'Виктор']
функция должна возвращать {lucky: "Виктор", loser:"Константин", other:["Женя","Иван"]} Моя решение на котором растрял
function nameFind(array){
  let first=[]
  let second=[]
  let third=[]
  let forth=[]
  for(let i=0; i<array.length; i++){
      if(array[i]==='Женя'){
        first.push(array[i])  
      } 
  if(array[i]==='Иван'){
        second.push(array[i]) 
      }
  if(array[i]==='Виктор'){
        third.push(array[i]) 
      }
   if(array[i]==='Константин'){
        forth.push(array[i]) 
      }
  }
console.log(Object.assign({}, [first,second,third,fort])
}
let names=['Женя','Женя', 'Иван', 'Женя', 'Виктор', 'Виктор','Константин', 'Виктор', 'Виктор']
console.log(nameFind(names))
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Решение не верно, т.к. расчитывает только на эти 4 имени. Что, если там будут другие?

Алгоритм:
  1. составить объект, где ключи – имена, а значения – счётчики, сколько раз имя встретилось.
  2. после полного подсчёта, найти максимум и минимум счётчиков.
  3. собрать имена, у которых счётчик равен максимуму или минимуму. Каждого, теоретически, может оказаться больше одно, поэтому – в массивы имён.
  4. пройти по всем ключам объекта со счётчиками, и исключить имена, которые есть среди макс и мин. – останутся «остальные».


spoiler
const mostLeastAndTheRest = names => {
  const dict = names.reduce((acc, name) => ((acc[name] ??= 0), acc[name]++, acc), {});
  // { "Женя": 3, "Иван": 1, "Виктор": 4, "Константин": 1 }

  const values = Object.values(dict);
  const max = Math.max(...values);
  const min = Math.min(...values);

  const entries = Object.entries(dict);
  const winners = entries.filter(([_, value]) => value === max).map(([key, _]) => key);
  const losers = entries.filter(([_, value]) => value === min).map(([key, _]) => key);
  const rest = Object.keys(dict).filter(name => !winners.includes(name) && !losers.includes(name));
  return { winners, losers, rest };
};

mostLeastAndTheRest(['Женя', 'Женя', 'Иван', 'Женя', 'Виктор', 'Виктор', 'Константин', 'Виктор', 'Виктор']);
/*
{
  "winners": [ "Виктор" ],
  "losers": [ "Иван", "Константин" ],
  "rest": [ "Женя" ]
}
*/


Ещё вопрос — особый случай, если всех одинаковое число, то все – «победители» или «проигравшие» ?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы