我编写了一个函数,它接受plevel
(整数)和slevel
(数字字符串数组)并找到plevel
与{{1}中的值之间的最小差异}}。但是,当我运行脚本时,它没有响应,调试器说slevel
未定义。
diff
此处调用该函数:
var findDiff = function findDiff(plevel, slevel) {
var diff = new Array();
for (i=0; i<=slevel.length; i++) {
sleveli = parseInt(slevel[i]);
diff.push(Math.abs(plevel-sleveli));
}
if (diff.length > 1){
diff.sort(function(a, b){return a-b});
return diff[0]
}
else{
return diff[0];
}
}
var matches = new Array();
var newFetch = Data.find().fetch();
for(i = 0; i <= newFetch.length; i++ ){
pointsMatch = 0
var difference = findDiff(newFetch[i].level, spec.level);
pointsMatch -= (difference*3);
matches.push([newFetch[i], pointsMatch])
}
console.log(matches)
是一个mongoDB集合。 Data
是一个数组字符串数组,存储为对象中的属性。
答案 0 :(得分:0)
我认为评论中的人是对的;我们需要看到更多您的输入才能正确调试。但是你可以通过跟踪分钟来简化你的代码:
var findDiff = function findDiff(plevel, slevel) {
var min = Number.MAX_SAFE_INTEGER;
for (i=0; i<slevel.length; i++) {
sleveli = parseInt(slevel[i]);
var diff = Math.abs(plevel-sleveli);
min = Math.min(min, diff)
}
return min;
}
var a = ["1", "2", "10", "17"]
var p = 6
// We're expecting 4 as the min diff
console.log(findDiff(p, a))
// ...prints out 4 :-)
正如Omri指出的那样,在for循环中使用<
而不是<=
。
注意 - 数字并不总是可用 - 请参见:
您也可以将初始分钟设置为适合您的可能数据的大小,例如2 ^ 10
答案 1 :(得分:0)
我想指出名称空间污染,这可能会造成严重的麻烦。根据我的理解,你有两个命名空间污染案例,其中一个创建了无限循环。
实际上你有一个内部的外环,由一个函数分隔。你的外围for循环:
for(i = 0; i <= newFetch.length; i++ ){
pointsMatch = 0
...
然后你的内在循环:
for (i=0; i<=slevel.length; i++) {
sleveli = parseInt(slevel[i]);
...
由于var
之前缺少i
,因此循环定义实际上都是这样的:
for (window.i=0; ...
因此内部循环会覆盖外部循环所依赖的变量i
以终止。 i
是“污染”命名空间。
第二种情况是无害的:
sleveli = parseInt(slevel[i]);
由于缺少var
,这实际上导致了
window.sleveli = parseInt(slevel[i]);
最好是
var sleveli = parseInt(slevel[i]);
但这是一颗定时炸弹。
我建议您在for循环中将var
添加到i
的定义中。