我正在尝试练习我的算法技巧。我知道已经有一个算法写在那里,我只想自己尝试一下,看看我能接近多少。
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 }
答案 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)
我立即确定了三个您可能想要提出的问题。
第一个问题是您没有使用
var
来声明i
。
arr2
中的项目的循环也会修改 arr2
... 很多! for (i = ...)
更改为for (var i = ...)
。arr2
中找到某个项目,那么它就不应该修改arr2
来执行此操作。也许你不需要循环;
Array.prototype.indexOf
或Array.prototype.includes
代替整个循环!function checkIfExists(word) { results[word] = arr1.filter(function(w) { return w === word; }).length; }
代替整个功能!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);