Удалить лишние объекты из console.log - PullRequest
0 голосов
/ 06 июня 2018

У меня есть блок кода, который предназначен для подсчета количества повторяющихся букв в строке и возврата строки, называемой unique (в основном это введенная строка в алфавитном порядке, без специальных символов).Вот мой код:

function removeDuplicates(str){
  if(typeof(str) != 'string'){
    return `${str} Is not a string`;
  }
  var main = str.toLowerCase();
  var count = main.length;
  var letters = [];
  var remnants = [];
  var sorted;
  var duplicates = 0;
  var result = {};
  for(i=0; i <= count - 1; i++){
    var letter = main[i];
    letters.push(letter);
  }
  function countInArray(array, x){
    var noOfItems = array.filter(one => one == x).length;
    if (noOfItems > 1 || noOfItems < 1){
      duplicates++;
      var y = x.slice(0, -1)
      remnants.push(y);
    } else {
      var remnant = remnants.push(x);
      var joined = remnants.join('');
      function sortAlphabets(text) {
        return text.split('').sort().join('');
      }
      var temp = sortAlphabets(joined);
      var sorted = temp.replace(/[^a-zA-Z ]/g, "")
      result['uniques'] = sorted;
      result['duplicates'] = duplicates / 2;
      console.log(result);
    }
  }
  letters.forEach(item => {
    countInArray(letters, item);
  });
}

Решение должно выглядеть так: {uniques: 'aehlstx', duplicates: 2}, когда я запускаю removeDuplicates('th#elex_ash?'),

Но мой код печатает это:

{ uniques: 't', duplicates: 0 }
{ uniques: 't', duplicates: 0.5 }
{ uniques: 'lt', duplicates: 1 }
{ uniques: 'ltx', duplicates: 1.5 }
{ uniques: 'ltx', duplicates: 1.5 }
{ uniques: 'altx', duplicates: 1.5 }
{ uniques: 'alstx', duplicates: 1.5 }
{ uniques: 'alstx', duplicates: 2 }

Полагаю, это часть letter.forEach(), но я не вижу другого способа перебора массива (не вызывая подобных проблем).

1 Ответ

0 голосов
/ 06 июня 2018

Есть две основные проблемы:

  1. Вы звоните console.log в forEach.Переместите это после цикла.
  2. Когда вы идентифицируете дубликат, вы не удаляете его из массива, поэтому вы никогда не вводите блок else для этой буквы, и он не включается в результат.

Однако вы можете значительно упростить свой код:

function removeDuplicates(str) {
  str = str.replace(/[^a-zA-Z ]/g, "").toLowerCase().split("").sort();

  var setOfLetters = {};
  var resultingStringArray = [];
  var duplicateCount = 0;
  for (var char of str) {
    var count = setOfLetters[char] || 0;
    if (count === 0) {
      resultingStringArray.push(char);
      setOfLetters[char] = 1;
    }
    else {
      if (count === 1) {
        duplicateCount++; // this will count the duplicate once ("aaabb" -> 2 duplicates)
      }
      setOfLetters[char]++;
    }
  }

  return {
    "uniques": resultingStringArray.join(""),
    "duplicates": duplicateCount
  };
};

console.log(removeDuplicates('th#elex_ash?'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...