我正在尋找一種方法來將最大/最小功能添加到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
是否有另一種方法可以使用?
我正在尋找一種方法來將最大/最小功能添加到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
是否有另一種方法可以使用?
的for...in
迴路用於通過一個對象的屬性循環。如果你想從你的數組中的值,你可以這樣做:
for (var i = 0; i < myArray.length; i++)
{
console.log(myArray[i])
}
也``對象[字符串]與`數組[數字]` – 2011-02-16 19:20:25
您需要使用hasOwnProperty進行檢查。 然而,無論你在哪裏循環,這都需要應用。
即:
for(i in myArray)
{
if(arr.hasOwnProperty(i))
{
console.log(i);
}
}
對我來說,這是一個駭人聽聞的問題。我拒絕在我所有的for循環中添加這樣的代碼。因此,我拒絕允許使用任何擴展JS Object的庫。此外,如果期望按順序返回,則不應使用`for in`來迭代數組,否則`for in`中元素的順序未定義。它目前的工作,但大多數新的瀏覽器正在放棄這種行爲有利於性能增益 – 2011-10-14 18:08:21
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)
接受的解決方案解決您的直接問題,但擴展核心對象通常是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
,否則這是一個有用的選擇。
有一個更現代(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
不,我沒有。考慮閱讀「使用陣列」 – 2011-02-16 19:16:36