[英]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 :-)
正如Omri指出的那樣,在for循環中使用<
not <=
。
注意-號碼並非始終可用-參見此處:
您也可以將初始最小值設置為適合您的可能數據的較大值,例如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.