2013-05-19 62 views
0

我正在開發一個項目,它使用了大量的「javascript」。 我有很多「ajax」調用,它總是返回一個「json」數組。 由於有用的原因,我創建了兩個Array對象原型(「in_array」函數和「shuffle」函數)。在數組中的JavaScript原型循環

因爲我做了原型,所有我的「for in」循環都壞了(兩次顯示「undefined」...) 我看着google和stackoverflow,我現在知道我的錯誤。 當然,如果我刪除我的原型,「未定義」就會消失。

但是,我沒有找到我所有的答案。

首先,我看到很多次,使用「for in」循環很糟糕,爲什麼?

我也是在「PHP」或「python」中開發的,並且我喜歡「in」或「foreach」循環。其次,我得到了很多「for in」循環,所以我更喜歡改變我的原型,而不是改變我的循環。把我的原型切換到正常的函數,並保持「for in」循環,這太髒了嗎?

第三,我讀了JQuery可以糾正這個錯誤。我的項目確實有JQuery,解決方案在談論什麼(我只讀過JQuery可以更正此問題,而不是如何)。

謝謝

編輯: 我的原型代碼:

// FONCTIONS ARRAY 
Array.prototype.shuffle = function() { 
for (var i = this.length - 1; i > 0; i--) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var tmp = this[i]; 
    this[i] = this[j]; 
    this[j] = tmp; 
} 

return this; 
} 

Array.prototype.in_array = function (needle) { 
    for(var i = 0; i < this.length; i++) { 
     if(this[i] == needle) 
      return true; 
    } 
    return false; 
} 
+0

你是如何定義你的原型的?你怎麼做你的'for .. in'循環?你添加了「hasOwnProperty」檢查嗎? (它跳過原型)。不要在非框架代碼中使用'for'或'for .. in',編寫map函數。 – Halcyon

+0

不,我的目標是嘗試在我的所有循環中不添加任何內容(在我的代碼中獲得了超過50個「in」) – vekah

+0

然後編寫地圖函數 – Halcyon

回答

1

這裏有一個地圖功能,可以是什麼樣子。我從頭頂寫下了這個,所以可能會有錯誤。發生

function object_map(object, callback) { 
    var key, ret = {}; 
    for (key in object) { 
     if (Object.prototype.hasOwnProperty.call(object, key)) { 
      ret[key] = callback(key, object[key]); 
     } 
    } 
    return ret; 
} 
1

您的問題:

  1. ,因爲您要添加(枚舉)函數來Array.prototype然後將出現在你列舉的任何陣列中的任何時間。

  2. 因爲您不應該使用for ... in來枚舉數組,僅用於枚舉對象鍵。

如果你知道你在ES5瀏覽器中運行,你可以安全使用Object.defineProperty添加函數Array.prototype

Object.defineProperty(Array.prototype, 'shuffle', { 
    value: function() { 
     ... 
    } 
}); 

默認爲創建不可枚舉性能。