2013-05-13 38 views
1

我只是試圖讓一個小框架,學習的目的,我希望能夠使用的對象Array.prototype.forEach,這就是我現在所擁有的,我怎麼能夠在一個對象上使用Array.prototype.forEach?

var data = { test: 'test' }; 

Array.prototype.forEach(data, function(key value) { 
    console.log(key); 
}); 

但我得到一個錯誤,我確定你們可以看到爲什麼,但我不能:)所以任何幫助將非常感謝:)

+0

我會承擔的 「爲什麼呢?」是因爲一個對象不是一個數組。您的匿名函數中的參數中也有語法錯誤。 – 2013-05-13 15:59:45

回答

4

對象不是數組,並且不能訪問數組原型。你可以遍歷這些屬性。

for(var key in data){ 
     console.log(key) //or data[key] if you want the values 
    } 

關於下面的jQuery註釋,看起來他們在內部爲他們的「每個」函數使用循環。從source

// args is for internal usage only 
each: function(obj, callback, args) { 
    var value, 
     i = 0, 
     length = obj.length, 
     isArray = isArraylike(obj); 

    if (args) { 
     if (isArray) { 
      for (; i < length; i++) { 
       value = callback.apply(obj[ i ], args); 

       if (value === false) { 
        break; 
       } 
      } 
     } else { 
      for (i in obj) { 
       value = callback.apply(obj[ i ], args); 

       if (value === false) { 
        break; 
       } 
      } 
     } 

    // A special, fast, case for the most common use of each 
    } else { 
     if (isArray) { 
      for (; i < length; i++) { 
       value = callback.call(obj[ i ], i, obj[ i ]); 

       if (value === false) { 
        break; 
       } 
      } 
     } else { 
      for (i in obj) { 
       value = callback.call(obj[ i ], i, obj[ i ]); 

       if (value === false) { 
        break; 
       } 
      } 
     } 
    } 

    return obj; 
}, 
+0

這個工程,我只是認爲,jQuery做到了與他們的$ .each函數使用foreach原型 – Datsik 2013-05-13 16:00:48

+1

@XCritics [$ .each()](http://jsapi.info/jquery/1.8.3/jQuery.each) – Andreas 2013-05-13 16:01:43

+0

我認爲你混淆了forEach數組的forEach方法與for-in循環 – Dogoku 2013-05-13 16:03:13

0

您可以通過for(key in data)通過對象鍵循環,並通過data[key]獲得每個值。即

for(key in object) { 
    console.log(key, data[key]); 
} 
2

做這樣的:

Object.keys(data).forEach(function(key) { 
    console.log(data[key]) 
}); 

您可以根據需要對舊的瀏覽器墊片Object.keys()


如果你願意,你可以爲這個操作的包裝函數:

function objEach(obj, fn) { 
    Object.keys(obj).forEach(function(key) { 
     fn(obj[key], key) 
    }) 
    // or use for-in 
} 

然後使用它是這樣的:

objEach(data, function(val, key) { 
    console.log(key, val) 
}) 
2

如上所述,對象和陣列不同的東西。您可以創建一個函數,會爲你做這個,通過使用「呼」的調用:

Object.prototype.forEach = function(func, context) { 
    var value; 
    context = context || this; //apply the function to 'this' by default 
    for (key in this) { 
     if (this.hasOwnProperty(key)) { //to rule out inherited properties 
      value = this[key]; 
      func.call(context, key, value); 
     } 
    }  
}; 

而且使用這樣的:

obj = { "test1": 1, "test2": 2 }; 
obj.forEach(function(key, val) { 
    console.log(key, val); 
}); 
+0

爲什麼這是downvoted?有人可以用這種方法解釋問題嗎?想象一下,如果你需要解析一個充滿數組的巨大JSON blob。在for ... in循環中的數組中使用.forEach會導致任何JS linter發生變化。並使用嵌套...因爲所有聲明的變量都會被限定在周圍的函數中,所以在循環中變得非常快速。 – Danny 2015-03-07 16:42:38

1

它只會工作,如果你的目標是返回數組像,這意味着它有數字鍵和length

var obj = { 0:"something", 1:"something else", length:2 }; 

Array.prototype.forEach.apply(obj, [function(element, i) { 
    console.log(i, element); 
}]); 

這在上之類的東西FileList()使用forEach有用。

0

試試這個:

obj = {}; // Some object 
obj.forEach = function(fn) { 
    Object.keys(this).forEach((k)=> { 
     if (typeof(this[k]) != 'function') 
      fn(this[k]);}) 
     }; 
相關問題