簡體   English   中英

函數中的Javascript未定義數組

[英]Javascript undefined array in function

我已經寫了一個函數,它plevel (整數)和slevel (數字的串的陣列)和發現之間的最小差plevel和一個值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)

Data是mongoDB集合。 spec.level是一個數字字符串數組,作為屬性存儲在對象中。

我認為評論中的人是正確的; 我們需要查看您的更多輸入才能正確調試。 但是您可以通過跟蹤運行時的分鍾數來大大簡化代碼:

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循環中使用< not <=

注意-號碼並非始終可用-參見此處:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

您也可以將初始最小值設置為適合您的可能數據的較大值,例如2 ^ 10

我想指出地名空間污染,這可能會造成嚴重的麻煩。 以我的理解,您有兩種情況下的名稱空間污染,其中一種會造成無限循環。

實際上,您有一個內部外部循環,由一個函數分隔。 您的外部for循環:

for(i = 0; i <= newFetch.length; i++ ){
    pointsMatch = 0
    ...

然后您的內部for循環:

for (i=0; i<=slevel.length; i++) {
  sleveli = parseInt(slevel[i]);
  ...

由於i之前缺少var ,因此兩個for循環定義實際上都是這樣的:

for (window.i=0; ...

所以內環覆蓋可變i外環取決於終止。 i在“污染”命名空間。

第二種情況是無害的:

sleveli = parseInt(slevel[i]);

由於缺少var ,因此實際上導致

window.sleveli = parseInt(slevel[i]);

更好的是

var sleveli = parseInt(slevel[i]);

但這是一顆定時炸彈。

我建議您在var循環中將var添加到i的定義中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM