我的函数和循环有问题,不确定为什么。
var a = ['1,0,1', '0,1,0', '1,1,1'];
var b = [1, 1, 1];
function myFunction() {
for (i = 0; i < a.length; i++) {
var user = a[i].split(',');
var cs = cosinesim(user, b);
document.getElementById("cs").innerHTML += String(user) + ' ' + String(cs) + '<br>';
cs = 0;
user = '';
}
}
function cosinesim(A, B) {
var dotproduct = 0;
var mA = 0;
var mB = 0;
for (i = 0; i < A.length; i++) {
dotproduct += (parseInt(A[i]) * parseInt(B[i]));
mA += (parseInt(A[i]) * parseInt(A[i]));
mB += (parseInt(B[i]) * parseInt(B[i]));
}
mA = Math.sqrt(mA);
mB = Math.sqrt(mB);
if ((mA * mB) == 0) {
var similarity = 0
} else {
var similarity = (dotproduct) / (mA * mB)
}
return similarity;
}
<p id="cs"></p>
<button onclick="myFunction()">Click</button>
我正在尝试让函数遍历数组并打印出数组中每个元素的余弦相似度,但是它只打印第一个?如果删除cs变量和计算,该函数将打印出所有用户。我不确定为什么在函数中添加余弦函数会导致它仅运行一次?
任何帮助表示感谢,谢谢。
答案 0 :(得分:5)
您在两个函数中都使用了相同的(全局)变量i
。您应该在每个变量中将i
声明为局部变量:
var i;
或在for
循环中:
for (var i = 0; ...
因为两个循环当前都使用相同的i
,所以一旦运行cosinesim()
函数,第一个函数中的循环也将结束。
如果以“严格”模式进行编码,则会因此类隐式的全局用法而出错。