从console.log中删除多余的对象

时间:2018-06-05 21:39:11

标签: javascript arrays node.js function

我有一个代码块,用于计算字符串中重复字母的数量,并返回一个名为uniques的字符串(基本上是按字母顺序输入的字符串,没有特殊字符)。这是我的代码:

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 :(得分:1)

有两个主要问题:

  1. 您正在console.log中呼叫forEach。在循环之后移动它。
  2. 当您确定副本时,您不会将其从数组中删除,因此您永远不会输入该字母的else块,并且它不会包含在结果中。
  3. 但是,您可以大大简化代码:

    &#13;
    &#13;
    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?'));
    &#13;
    &#13;
    &#13;