gorwhoami
@gorwhoami

Как считать кол-во повторяющихся эл-ов в массиве?

let arr = [1,3,3,4,5,5,5];
function count(arr){
  let cnt = 1;
  let map = new Map();
  for(let i = 0; i< arr.length; i++){
    for(let j = 0; j< arr.length; j++){
      if(arr[i] == arr[j]){
          map.set(arr[i],cnt++);
      }
    }
  } return map;
}
console.log(count(arr)); //  map должен быть таким {1 => 1, 3 => 2, 4 => 1, 5 => 3} ,
// но выдает  {1 => 1, 3 => 5, 4 => 6, 5 => 15}
// Как реализовать такое? Если можно объясните что именно делать с этим кодом(и укажите ошибки в 
// коде) чтобы он стал работать корректно.
  • Вопрос задан
  • 180 просмотров
Решения вопроса 3
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
function count(arr){
  const map = new Map();
  arr.forEach(i => map.set(i, (map.get(i) || 0) + 1))
  return map;
}
Ответ написан
Seasle
@Seasle Куратор тега JavaScript
const count = array => array.reduce((accumulator, value) => {
	const total = accumulator.has(value) ? accumulator.get(value) : 0;

	accumulator.set(value, total + 1);

	return accumulator;
}, new Map());
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
let arr = [1,3,3,4,5,5,5];
function count(arr){
  let cnt = 1; // один счётчик на все значения?
  let map = new Map();
  for(let i = 0; i< arr.length; i++){
    for(let j = 0; j< arr.length; j++){ // плохо, что на каждый элемент весь массив перебираете
      // получается, считаются все пары одинаковых на каждом проходе.
      if(arr[i] == arr[j]){ // здесь каждый раз найдётся равенство самому себе
          map.set(arr[i],cnt++); // а общий счётчик всё больше и больше
      }
    }
  } return map;
}
console.log(count(arr));


Для решения задачи подсчёта не нужно вложенных циклов.
Пройти по каждому элементу достаточно всего один раз.
И внести в "словарь": 1, если ещё не было такого, или увеличить на 1, если уже было.

исправленный ваш код
let arr = [1,3,3,4,5,5,5];
function count(arr){
  const map = new Map();
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    const value = arr[i];
    if (!map.get(value)) map.set(value, 0); // создать счетчик
    map.set(value, map.get(value) + 1); // увеличить на 1
  }
  return map;
}
console.log(count(arr));
/*
Map(4)
  ​size: 4
  ​<entries>
​​    0: 1 → 1
​​    1: 3 → 2
​​    2: 4 → 1
​​    3: 5 → 3
*/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iddqda
network engineer, netdevops
я подобное примерно так делаю:
let arr = [1,3,3,4,5,5,5];
obj = new Object();
arr.forEach((el)=>(obj.hasOwnProperty(el)) ? obj[el]++ : obj[el] = 1);
console.log(obj); // Object { 1: 1, 3: 2, 4: 1, 5: 3 }

ну т.е. использую свойство объекта - уникальность ключей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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