1. 程式人生 > >Javascript 陣列迴圈遍歷之forEach(轉載自oscar999)

Javascript 陣列迴圈遍歷之forEach(轉載自oscar999)

1.  js 陣列迴圈遍歷。

陣列迴圈變數,最先想到的就是 for(var i=0;i<count;i++)這樣的方式了。

除此之外,也可以使用較簡便的forEach 方式

2.  forEach 函式。

Firefox 和Chrome 的Array 型別都有forEach的函式。使用如下:
[html] view plain copy print?
  1. <!–Add by oscar999–>
  2. <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.0 Transitional//EN”>
  3. <HTML>
  4. <HEAD>
  5. <TITLE
    > New Document </TITLE>
  6. <METANAME=“Author”CONTENT=“oscar999”>
  7. </HEAD>
  8. <BODY>
  9. <script>
  10. var arryAll = [];  
  11. arryAll.push(1);  
  12. arryAll.push(2);  
  13. arryAll.push(3);  
  14. arryAll.push(4);  
  15. arryAll.forEach(function(e){  
  16.     alert(e);  
  17. })  
  18. </script>
  19. </BODY>
  20. </HTML>
<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
</HEAD>

<BODY>
<script>
var arryAll = [];
arryAll.push(1);
arryAll.push(2);
arryAll.push(3);
arryAll.push(4);

arryAll.forEach(function(e){
    alert(e);
})

</script>
</BODY>
</HTML>

但是以上,程式碼在IE中卻無法正常工作。

因為IE的Array 沒有這個方法

[javascript] view plain copy print?
  1. alert(Array.prototype.forEach);  
alert(Array.prototype.forEach);
執行以上這句得到的是  “undefined”, 也就是說在IE 中 Array 沒有forEach的方法。

3.  讓IE相容forEach方法

既然IE的Array 沒喲forEach方法, 我們就給它手動新增這個原型方法。
[javascript] view plain copy print?
  1. //Array.forEach implementation for IE support..
  2. //https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
  3. if (!Array.prototype.forEach) {  
  4.     Array.prototype.forEach = function(callback, thisArg) {  
  5.         var T, k;  
  6.         if (this == null) {  
  7.             thrownew TypeError(“ this is null or not defined”);  
  8.         }  
  9.         var O = Object(this);  
  10.         var len = O.length >>> 0; // Hack to convert O.length to a UInt32
  11.         if ({}.toString.call(callback) != “[object Function]”) {  
  12.             thrownew TypeError(callback + “ is not a function”);  
  13.         }  
  14.         if (thisArg) {  
  15.             T = thisArg;  
  16.         }  
  17.         k = 0;  
  18.         while (k < len) {  
  19.             var kValue;  
  20.             if (k in O) {  
  21.                 kValue = O[k];  
  22.                 callback.call(T, kValue, k, O);  
  23.             }  
  24.             k++;  
  25.         }  
  26.     };  
  27. }  
//Array.forEach implementation for IE support..
//https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(callback, thisArg) {
        var T, k;
        if (this == null) {
            throw new TypeError(" this is null or not defined");
        }
        var O = Object(this);
        var len = O.length >>> 0; // Hack to convert O.length to a UInt32
        if ({}.toString.call(callback) != "[object Function]") {
            throw new TypeError(callback + " is not a function");
        }
        if (thisArg) {
            T = thisArg;
        }
        k = 0;
        while (k < len) {
            var kValue;
            if (k in O) {
                kValue = O[k];
                callback.call(T, kValue, k, O);
            }
            k++;
        }
    };
}
詳細介紹可以參照:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach

4. 如何跳出迴圈?

 Js 此種狀況的forEach 不能使用continue, break;  可以使用如下兩種方式:
1. if 語句控制
2. return . (return true, false)
return –> 類似continue


以下例子是取出陣列中2的倍數和3的倍數的數;
[html] view plain copy print?
  1. <!–Add by oscar999–>
  2. <!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.0 Transitional//EN”>
  3. <HTML>
  4. <HEAD>
  5. <TITLE> New Document </TITLE>
  6. <METANAME=“Author”CONTENT=“oscar999”>
  7. </HEAD>
  8. <BODY>
  9. <script>
  10. if (!Array.prototype.forEach) {  
  11.     Array.prototype.forEach = function(callback, thisArg) {  
  12.         var T, k;  
  13.         if (this == null) {  
  14.             throw new TypeError(“ this is null or not defined”);  
  15.         }  
  16.         var O = Object(this);  
  17.         var len = O.length >>> 0; // Hack to convert O.length to a UInt32  
  18.         if ({}.toString.call(callback) != ”[object Function]”) {  
  19.             throw new TypeError(callback + ” is not a function”);  
  20.         }  
  21.         if (thisArg) {  
  22.             T = thisArg;  
  23.         }  
  24.         k = 0;  
  25.         while (k <len) {  
  26.             var kValue;  
  27.             if (k in O) {  
  28.                 kValue = O[k];  
  29.                 callback.call(T, kValue, k, O);  
  30.             }  
  31.             k++;  
  32.         }  
  33.     };  
  34. }  
  35. var arryAll = [];  
  36. arryAll.push(1);  
  37. arryAll.push(2);  
  38. arryAll.push(3);  
  39. arryAll.push(4);  
  40. arryAll.push(5);  
  41. var arrySpecial = [];  
  42. arryAll.forEach(function(e){  
  43.     if(e%2==0)  
  44.     {  
  45.         arrySpecial.push(e);  
  46.     }else if(e%3==0)  
  47.     {  
  48.         arrySpecial.push(e);  
  49.     }  
  50. })  
  51. </script>
  52. </BODY>
  53. </HTML>
<!--Add by oscar999-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
</HEAD>

<BODY>
<script>
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(callback, thisArg) {
        var T, k;
        if (this == null) {
            throw new TypeError(" this is null or not defined");
        }
        var O = Object(this);
        var len = O.length >>> 0; // Hack to convert O.length to a UInt32
        if ({}.toString.call(callback) != "[object Function]") {
            throw new TypeError(callback + " is not a function");
        }
        if (thisArg) {
            T = thisArg;
        }
        k = 0;
        while (k < len) {
            var kValue;
            if (k in O) {
                kValue = O[k];
                callback.call(T, kValue, k, O);
            }
            k++;
        }
    };
}

var arryAll = [];
arryAll.push(1);
arryAll.push(2);
arryAll.push(3);
arryAll.push(4);
arryAll.push(5);

var arrySpecial = [];

arryAll.forEach(function(e){
    if(e%2==0)
    {
        arrySpecial.push(e);
    }else if(e%3==0)
    {
        arrySpecial.push(e);
    }
})

</script>
</BODY>
</HTML>

使用return 達到以上效果
[javascript] view plain copy print?
  1. arryAll.forEach(function(e){  
  2.     if(e%2==0)  
  3.     {  
  4.         arrySpecial.push(e);  
  5.         return;  
  6.     }  
  7.     if(e%3==0)  
  8.     {      
  9.         arrySpecial.push(e);  
  10.         return;  
  11.     }  
  12. })  
arryAll.forEach(function(e){
    if(e%2==0)
    {
        arrySpecial.push(e);
        return;
    }
    if(e%3==0)
    {    
        arrySpecial.push(e);
        return;
    }
})

至於如何寫類似break 的效果,目前尚未找到比較好的辦法。

有搜尋一下,有的說return false 可以達成, 試了一下, 效果和return 和return ture 是一樣的。