2011-02-16 90 views
2

我正在尋找一種方法來將最大/最小功能添加到JavaScript的Array類,這似乎是一個解決的問題:JavaScript: min & max Array values?。但是,當我嘗試使用它時,我開始從我的代碼中獲取錯誤。事實證明,這種方法不適用於循環。將函數添加到JavaScript的Array Array類中斷for循環

for(i in myArray) { console.log(i) } 

prints out 


1
2
3
max
min

是否有另一種方法可以使用?

+0

不,我沒有。考慮閱讀「使用陣列」 – 2011-02-16 19:16:36

回答

6

for...in迴路用於通過一個對象的屬性循環。如果你想從你的數組中的值,你可以這樣做:

for (var i = 0; i < myArray.length; i++) 
{ 
    console.log(myArray[i]) 
} 
+0

也``對象[字符串]與`數組[數字]` – 2011-02-16 19:20:25

1

您需要使用hasOwnProperty進行檢查。 然而,無論你在哪裏循環,這都需要應用。

即:

for(i in myArray) 
{ 
    if(arr.hasOwnProperty(i)) 
    { 
    console.log(i); 
    } 
} 
+0

對我來說,這是一個駭人聽聞的問題。我拒絕在我所有的for循環中添加這樣的代碼。因此,我拒絕允許使用任何擴展JS Object的庫。此外,如果期望按順序返回,則不應使用`for in`來迭代數組,否則`for in`中元素的順序未定義。它目前的工作,但大多數新的瀏覽器正在放棄這種行爲有利於性能增益 – 2011-10-14 18:08:21

2

for in是一種常見的JavaScript陷阱。它不像其他語言的foreach那樣工作,它實際上列舉了給定對象中的所有屬性。

由於Javascript數組恰好有一個使用for in有時會使用for in的索引屬性,但正如您所看到的,它還列舉了您添加的任何其他屬性。另一個問題是,for in不能保證以任何特定的順序瀏覽這些屬性,因此您的結果可能因您使用的瀏覽器/運行時間而異。

然後,用一個無聊的for循環來代替是更安全的。有在Javascript很多for循環成語,所以我將列出一些:

定期for循環:

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

定期循環,緩存長度:

for(i=0, n=arr.length; i<n; i++){ 

遍歷對象的數組/ NodeLists:

for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values 
    foo(obj) 
10

接受的解決方案解決您的直接問題,但擴展核心對象通常是bad idea。以後使用for..in包含庫時會發生什麼?或者當你幾個月後忘了在代碼的不同部分使用錯誤的方法?

另一種選擇是包裝和擴展。創建一個新的類型,使用的Array實例作爲其原型:

function ArrayThing() {} 

ArrayThing.prototype = new Array(); 

現在你已經有了一個對象,你可以在不影響Array擴展:

ArrayThing.prototype.max = function() { 
    return Math.max.apply(null, [].slice.call(this, 0)) 
} 

ArrayThing.prototype.min = function() { 
    return Math.min.apply(null, [].slice.call(this, 0)) 
} 

var list = new ArrayThing(); 

// standard array methods still work 
list.push(5); 
list.push(22); 
list.push(0); 
list.push(-14); 
list.length // => 4 

// as do your new custom methods 
list.max() // => 22 
list.min() // => -14 

這不會在每一個工作情況,但除非你確定你確實需要一個Array,否則這是一個有用的選擇。

0

有一個更現代(IE9 +)的方式,現在做到這一點:

var g = []; 

Object.defineProperty(g, "log", { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: function(){ console.log(this); } 
}); 


g.push(5); 
g.push(9); 

var t; 
for (t in g){ 
    console.log(g[t]); 
} 

印刷5和9,但不會列出的「日誌」功能

g.log() -> echos [5,9] 

這一工作的關鍵是能夠將屬性標記爲「enumerable:false」,並將該屬性標記爲不應該迭代的內容。

更多Object.defineProperty這裏: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty