Повторы слов [Повтор темы - оффтоп]

Решение задания:

function getRepeats(array) {
  var repeats = {};

  for (var i = 0; i < array.length; i++) {
    var word = array[i]; 

    if (!repeats[word]) {
      repeats[word] = 1;
    } else if (repeats[word] > 0) {
      repeats[word] += 1;
    }
  }

  return repeats;
};
2 лайка
const getRepeats = function(array) {
  let obj = {};
  for (let i = 0; i < array.length; i++) {
      if (!obj[array[i]]) {
        obj[array[i]] = 1;
      } else {
        obj[array[i]]++;
      }
  }  
  return obj;
}

подскажите, как работает это условие ? немогу понять(

Добрый вечер, справился вот так:

 var getRepeats = function(arrayData) {
     var repeats = {
     };
     for (var i = 0; i < arrayData.length; i++) {
         var counter = 0;
         for (var j = 0; j < arrayData.length; j++) {
             if (arrayData[i] === arrayData[j]) {
                 counter += 1;
                 repeats[arrayData[i]] = counter;
             }
         }
     }
     return repeats;
  }
3 лайка

Если кого-то еще интересует, что происходит в этой проверке:
При подстановке obj[array[i]] в условие, оно будет либо иметь значение undefined (если такого свойства в объекте нет), либо численное значение, когда оно там уже есть (1, 2, 3 и т.д., сколько раз оно нам встречалось).
Логический оператор !(отрицание) будет:

  1. Преобразовывать это значение к булевому типу: true/false.
    undefined станет false, а численные значения (кроме 0) станут true;
  2. Возвращать противоположное значение.

Таким образом, если array[i] это свойство, которого объекте obj не существует, оно будет иметь значение undefined. При приведении к логическому типу оно станет false и затем отрицание вернет противоположное значение - true. А при if(true) выполняется тело условия -
obj[array[i]] = 1;
Свойство записывается в объект и ему присваивается значение 1.
Если же оно попадается нам снова. То при приведении к логическому типу
1 уже будет равно true.
Тогда оператор отрицания вернет в if противоположное значение -
if(false)
Соответственно, выполнится код в блоке else.

Можно сделать немного более понятно, избавившись от отрицания:

for( var i=0; i<array.length; i++ ){
if(obj[array[i]]) obj[array[i]]++; // Если свойство существует - прибавь 1.
else obj[array[i]] = 1; // В других случаях - создай со значением 1.
}

4 лайка

Здравствуйте!
Мой вариант:

let getRepeats = function(array) {
  let obj = {};
  
  for(let i = 0; i < array.length; i++){
    if (obj[array[i]] !== undefined) {
      obj[array[i]]++;
    } else {
      obj[array[i]] = 1;
    }
  }

  return obj;
}
let getRepeats=function(wordList){
   
  let repeatsWords={};
   
   for(i=0;i<wordList.length;i++){
      
     repeatsWords[wordList[i]]= 0;
    }
    for(i=0;i<wordList.length;i++){
     
    repeatsWords[wordList[i]]= repeatsWords[wordList[i]]+1;
     }
  return  repeatsWords;
}

const getRepeats = arr=> arr.reduce((acc,el)=>{ acc[el]=(acc[el] ||0) + 1; return acc },{})

Я вероятно совсем тугой на соображалку, делал задание часа 3 точно…:

let getRepeats = function (arr) {

let object = {};

for (let i=0; i<arr.length; i++) {
  object[arr[i]]=0; 
}       
   
for (let i=0; i<arr.length; i++) { 
  object[arr[i]]++                    
}      

return object

}

Спасибо большое за то что разжевали!!!

Мой код:
let getRepeats = function(data) {
let words = {};
for (i = 0; i < data.length; i ++) {
if (words[data[i]]) {
words[data[i]] ++;
} else {
words[data[i]] = 1;
}
}
return words;
}

Сложное решение… 2 цикла + indexOf

let getRepeats = function (array) {

let word = 0; // Кол-во слов
let index = 0; // Позиция в массиве
let obj = {}; // создаем объект

while (index < array.length) { //  текущая позиция 

for (let i = 0; i < array.length; i++) { // текущее слово
   if (array[i].indexOf(array[index]) !== -1) { //если текущее слово находится в текущей позиции
      word++; // добавляем слову единицу
   };
};

let key = array[index]; // добавляем в переменную текущую позицию
obj[key] = word; // записываем в объект ключ=текщая позиция, значение кол-во слова
word = 0; // обнуляем кол-во слов
index++; // переходим к следущей позиции массива
};
return obj; // по итогу возращаем собраный объект
}