Повторы слов 2/5

а в чем наглядность?
в добавлении тернарного оператора в коллбек?
а что undefined || 0 уже недостаточно?

для меня такая запись - (p[c] || 0) + 1; - не очень читается

1 лайк

так и reduce не очень читается, пишите через цикл тогда. эти методы не для читабельности в стандарт добавляли. также и с regExp

зачем писать через цикл, если есть современные методы для работы с массивами, которые уже содержат в себе этот цикл?

вы сами себе теперь противоречите

Спасибо за решение, зачем indexOf используется? я так и не понял

Здравствуйте!
Подскажите, пожалуйста, в чем ошибка

var obj = {     
    };

    var getRepeats = function (massive) {
       
    for (var i = 0; i<= massive.length-2; i++) {

      for (var j = i+1; j < massive.length; j++) {    
             obj[massive[i]] = 1;
             
              if (massive[j] == massive[i]) {
              obj[massive[i]]++;
              }   
          } 
       }
    return obj;
     }

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

вам нужно искать не сравнение двух элементов массива, а запрос на существование ключа в объекте и если он уже есть, то инкремент значения ключа.

еще нужно инкапсулировать объект

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

Я, видимо, совсем глухой. Сколько не пытался самостоятельно решить это здание, но ничего не вышло. Получилось вот что (это не решение, потому что в конце я уже не знаю, что делать):

var getRepeats = function (array) {
  var result = [];
  var answer = [];
  var question = [];
  var gen = [];
  
  for (var i = 0; i < array.length; i++) {
    result.push(array.indexOf(array[i]));
  } 
  
  for (var j = 0; j < result.length - 1; j++) {
    var min = j;
    for (var x = j + 1; x < result.length; x++) {
      if (result[x] < min)  {
        var man = result[j];
        result[j] = result[x];
        result[x] = man;
      }  
    }
  }
  
  for (var asteriks = result[0]; asteriks <= result[result.length - 1]; asteriks++) {
    var instrument = 0;
    
    for (var karma = 0; karma < result.length; karma++) {
      if (result[karma] == asteriks) {
       instrument++;  
      }  
    }
    if (instrument != 0) {
      gen.push(instrument);
    }
  }
 
  for (var zebra = result[0]; zebra <= result[result.length - 1]; zebra++) {
  	var center = zebra;
    for (var zybr = 0; zybr < result.length; zybr++) {
      if (center == result[zybr]) {
        answer.push(zebra);
        center--;
      } else if (center != result[zybr]) {
        continue;
      }  
    }  
  }
  
  for (var bedFly = 0; bedFly < answer.length; bedFly++) {
    question.push(array[answer[bedFly]]);  
  }
  
  var flex = {
    name: question,
    number: gen,
  }
  
  return  flex;
}

Если это задание среднего уровня, то мне уже страшно идти дальше. :tired_face:

1 лайк

разбейте проблему на задачи:

  1. циклом перебрать массив
  2. если в объекте ключ есть, то увеличить ключ
  3. если нет ключа, то присвоить объекту ключ с значением 1.
  4. вернуть объект

Получилось:

let getRepeats = function (array) {
  let object = {}
  for (var i = 0; i < array.length; i++) {
    if (object[array[i]]) {
      object[array[i]]++ ;  
    } else {
      object[array[i]] = 1;
    }
  }
  return object;
}

Спасибо большое. Уже какой раз помогаете. :grin:
Если я правильно понял, то в этом коде я прохожу циклом по массиву, выбранные значения сравниваю по одному с ключом объекта и, если он есть, то увеличиваю значение ключа на единицу, а если нет, то присваиваю ему единицу?
Заранее извиняюсь за наглость, но вы знаете, как заставить работать этот код?

let getRepeats = function (array) {
  let object = {},
           x = object[array[i]];
  for (var i = 0; i < array.length; i++) {
    object[array[i]] = (x) ? x++ : 1;
  }
  return object;
}

да, все верно, по поводу кода:

я хз что вы планируете делать, тут ошибка на ошибке.

  1. у вас счетчик объявляется внутри цикла, а переменную вы описываете уже с ним. области видимости не совпадают.
  2. тернарный оператор описывается не так
  3. для сравнения используются == или ===

возможно вот так:

const getRepeats = function(array) {
  const object = {};
  for (var i = 0; i < array.length; i++) {
    let x = array[i];
    object[x] ? object[x]++ : object[x] = 1;
  }
  return object;
}

но я хз чем это от предыдущего отличается, разве что чтение тяжелее стало.

1 лайк

Возможно ошибаюсь, но такого варианта вроде не было

var getRepeats = function (word) {
  var words = {};
  
  for (var i = 0; i < word.length; i++) {
    if (words[word[i]] === undefined) {
      words[word[i]] = 1;
    } else {
      words[word[i]]++;
    }}
  return words;
}

было, это как раз и есть первый вариант, только у вас синтаксис устаревший

Вов. Пасиба. Слушай, а вот ты сделал через ! , то есть он принимает только true, а undefined считает тоже как ложное значение. Верно?

А то я пытался сделать сначала через false, но он его не принял.

почитайте про преобразование типов, чтобы четко понимать сравнения двух примитивов, чтобы сходу можно было бы сказать что больше 5 или false, a или b, a или А, а или 2, null или undefined, 0 или undefined, это важные основы языка, которым в академии мало уделяют внимания

Спс за рекомендацию. Сделаю

добрый день, спасибо за твое рещение! Подскажи, насколько кривой мой вариант:

var getRepeats = function(data)
{
  var repetitions = {
  };
  
  for (var i = 0; i < data.length; i++)
  {
    if (repetitions[data[i]] === undefined)
    {
      repetitions[data[i]] = 1;
      for (var j = i+1; j < data.length; j++)
      {
        if (data[j] === data[i])
        {
          repetitions[data[i]]++;
        }
      }
    }
  }
  return repetitions;
}

здравствуйте.

объясните, пожалуйста, как именно работает выделенная строчка кода. проверку проходит (решение подсмотрел в комментах), но хочу разобраться почему:

var getRepeats = function (datas) {
var wordsQuantity = {}
for (var i = 0; i < datas.length; i++) {
var quantity = 0;
for (var j = 0; j < datas.length; j++) {
if (datas[i] === datas[j]) {
wordsQuantity[datas[i]] = quantity = quantity + 1;
}
}
}
return wordsQuantity;
}

Добрый день, подскажите, пожалуйста, почему мой код

var mass = [“Василий”,“Пётр”,“Иннокентий”,“Пётр”,“Иван”,“Василий”];

var obj= {};
var getRepeats = function(counter){

for (var i=0; i<counter.length; ++i){

var a = counter[i];
if(obj[a] != undefined){
  ++obj[a];
  }else{
    obj[a] = 1;
  }
}

return obj
}
console.log(getRepeats(mass))

Не проходит тесты, хотя в консоле параметры выбрасывает правильные