Javascript未定义的数组在函数中

时间:2015-03-03 21:40:08

标签: javascript arrays function

我编写了一个函数,它接受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是一个数组字符串数组,存储为对象中的属性。

2 个答案:

答案 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 :-)

http://repl.it/ceX

正如Omri指出的那样,在for循环中使用<而不是<=

注意 - 数字并不总是可用 - 请参见:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

您也可以将初始分钟设置为适合您的可能数据的大小,例如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的定义中。