计算数组中的重复值Javascript

时间:2017-06-10 04:25:17

标签: javascript algorithm

我正在尝试练习我的算法技巧。我知道已经有一个算法写在那里,我只想自己尝试一下,看看我能接近多少。

INPUT:

arr1 = ['asd','ew','lol','asd']

预期输出:

{ asd: 2, ew: 1, lol: 1 }

这是我的代码:

arr1 = ['asd', 'ew', 'lol', 'asd']
arr2 = []
results = {}

function checkIfExists(word) {
  if (arr2.length != 0) {
    for (i = 0; i < arr2.length; i++) {
      if (arr2[i] == word) {
        results[word] += 1
      } else {
        arr2.push(word)
        results[word] = 1
      }
    }
  } else {
    arr2.push(word)
    results[word] = 1
  }
}

for (i = 0; i < arr1.length; i++) {
  checkIfExists(arr1[i])
}
console.log(results)

实际输出:

{ asd: 2, ew: 2 }

2 个答案:

答案 0 :(得分:2)

您使用i作为全局变量,因此请勿使用两个循环。其他错误在于您的增量算法,它为结果数组添加了超过需要的计数。所以试试吧:

arr1 = ['asd','ew','lol','asd']
arr2 = [] 
results = {}

function checkIfExists(word){
    if (arr2.length != 0){
    	var exists = false;
      for (var j = 0; j < arr2.length; j++){
        if(arr2[j] == word){
          results[word] += 1
          exists = true;
          break;          
        }
      }
      if(!exists) {
          arr2.push(word)
          results[word] = 1
        }
    }else{
      arr2.push(word)
       results[word] = 1 
    }
}

for (var i = 0; i < arr1.length; i++) {
    checkIfExists(arr1[i])
}
console.log(results) 

答案 1 :(得分:1)

我立即确定了三个您可能想要提出的问题。

  1. 我的代码有什么问题?
    • 我无法比Felix Klings comment更好地说出这句话:
        

      第一个问题是您没有使用var来声明i

    • 可能用于定位arr2 中的项目的循环也会修改 arr2 ... 很多!
  2. 为什么我的代码产生错误的输出?您的代码实际上为其表达的逻辑生成正确的输出。我怀疑问题是它表达的逻辑与你想要表达的逻辑不匹配。这并不罕见
  3. 如何修复代码?
    • 首先将您的循环习语从for (i = ...)更改为for (var i = ...)
    • 考虑循环的目的。如果它打算在arr2中找到某个项目,那么它就不应该修改arr2来执行此操作。也许你不需要循环;
      1. 您可以使用Array.prototype.indexOfArray.prototype.includes代替整个循环!
      2. 您可以使用function checkIfExists(word) { results[word] = arr1.filter(function(w) { return w === word; }).length; }代替整个功能!
      3. 在设计函数时似乎可以使用一些更高级别的意识,因此尝试围绕此代码中的某些元素可能是个好主意:
  4. var arr1 = ['asd','ew','lol','asd'];
    var result = arr1.reduce(function(result, w) { result[w] = result[w] || 0;
                                                   result[w]++;
                                                   return result;              }, {}));
    console.log(result);