眼睛王蛇 發表於 2019-8-1 16:44:00

【前端-JavaScript】10种遍历方法

<h1 style="text-align: center">JavaScript之10种遍历方法</h1>
<h2>1. for 循环</h2>
<p>for循环语句,最基础的遍历,以数组的下标为索引,<span style="color: rgba(255, 0, 0, 1)"><strong>主要对数组元素进行遍历</strong></span>。</p>
<p>注意:for 循环不是函数,不存在返回值。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> arr = ;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i=0 ;i&lt;arr.length;i++<span style="color: rgba(0, 0, 0, 1)">){
      console.log(arr)   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> i=0 1 2 3</span>
    }</pre>
</div>
<h2>2. for in</h2>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>for in 循环主要用于遍历普通对象</strong></span>,i 代表对象的 key 值,obj 代表对应的 value, 当用它来遍历数组时候,多数情况下也能达到同样的效果,但是你不要这么做,这是有风险的,</p>
<p>因为 i 输出为字符串形式,而不是数组需要的数字下标,这意味着在某些情况下,会发生字符串运算,导致数据错误,比如:'52'+1 = '521' 而不是我们需要的 53。</p>
<p>另外 for in 循环的时候,不仅遍历自身的属性,还会找到 prototype 上去,<br>所以最好在循环体内加一个判断,就用 obj.hasOwnProperty(i),这样就避免遍历出太多不需要的属性。</p>
<div class="cnblogs_code">
<pre>&lt;body&gt;
&lt;div class="item div1" id="dd1"&gt;&lt;/div&gt;
&lt;div class="item div2" id="dd2"&gt;&lt;/div&gt;
&lt;div class="item div3" id="dd3"&gt;&lt;/div&gt;
&lt;div class="item div4" id="dd4"&gt;&lt;/div&gt;
&lt;div class="item div5" id="dd5"&gt;&lt;/div&gt;

&lt;script&gt;
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for in循环不仅可以遍历数组,还可以遍历对象,</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 但for in存在一些陷阱,比如它会在遍历完元素之后,还会对数组或对象的prototype中的属性进行遍历,</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 所以,for in 更像是为对象遍历而设计的。</span>
<span style="color: rgba(0, 0, 0, 1)">
    let obj </span>= {name:'zhou',age:18,gender:'男'<span style="color: rgba(0, 0, 0, 1)">};
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(let i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> obj){
      console.log(i,obj)
    }

    console.log(</span>"--------------------------------------------------------"<span style="color: rgba(0, 0, 0, 1)">);
    let divObj</span>= document.querySelectorAll('div'<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(let i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> divObj){
      console.log(i,divObj);
      console.log(divObj.id);
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">总结:for in 循环主要用于遍历普通对象,i 代表对象的 key 值,obj 代表对应的 value, 当用它来遍历数组时候,多数情况下也能达到同样的效果,
    但是你不要这么做,这是有风险的,因为 i 输出为字符串形式,而不是数组需要的数字下标,这意味着在某些情况下,会发生字符串运算,导致数据错误,比如:'52'+1 = '521' 而不是我们需要的 53。

    另外 for in 循环的时候,不仅遍历自身的属性,还会找到 prototype 上去,
    所以最好在循环体内加一个判断,就用 obj.hasOwnProperty(i),这样就避免遍历出太多不需要的属性。</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
&lt;/script&gt;</pre>
</div>
<h2>3. whild 和 do while 循环</h2>
<div class="cnblogs_code"><img id="code_img_closed_f656024f-e686-4aac-b3c3-dede1bea3498" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_f656024f-e686-4aac-b3c3-dede1bea3498" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_f656024f-e686-4aac-b3c3-dede1bea3498" class="cnblogs_code_hide">
<pre>    let cars=["BMW","Volvo","Saab","Ford"<span style="color: rgba(0, 0, 0, 1)">];
    let i</span>=0<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(;cars;){
      console.log(cars);
      i</span>++<span style="color: rgba(0, 0, 0, 1)">;
    }


    cars</span>=["BMW","Volvo","Saab","Ford"<span style="color: rgba(0, 0, 0, 1)">];
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> i=0<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">while</span><span style="color: rgba(0, 0, 0, 1)"> (cars){
      console.log(cars </span>+ "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">);
      i</span>++<span style="color: rgba(0, 0, 0, 1)">;
    };


    let j </span>= 3<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">{
      console.log(j);
      j</span>--<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">while</span>(j&gt;0<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>4. forEach</h2>
<p>forEach() 方法用于<span style="color: rgba(255, 0, 0, 1)"><strong>调用数组的每个元素,并将元素传递给回调函数</strong></span>。</p>
<div class="cnblogs_code">
<pre>let arr = ;
    arr.forEach(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(i,index,arr0){
      console.log(i); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数组每一项</span>
      console.log(index);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数组下标</span>
      console.log(arr0);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">该遍历的数组 arr</span>
    });</pre>
</div>
<p>详细用法介绍:</p>
<div class="cnblogs_code"><img id="code_img_closed_3fbae34c-db02-489e-b17f-04d4ef130185" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3fbae34c-db02-489e-b17f-04d4ef130185" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3fbae34c-db02-489e-b17f-04d4ef130185" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> let arr = ;</span>
    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">arr.forEach(function(i,index,arr0){
      console.log(i); //数组每一项
      console.log(index);   //数组下标
      console.log(arr0);//该遍历的数组 arr
    });</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ES6 箭头函数写法</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> arr.forEach(res =&gt;{</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   console.log(res);   //数组每一项</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> });</span>

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">// 一个小例子:修改产品的数量随机,求出每个产品的总价
    var data=[
      {id:1001,icon:"img/1.png",name:"餐饮0",num:1,price:10},
      {id:1002,icon:"img/2.png",name:"餐饮1",num:1,price:20},
      {id:1003,icon:"img/3.png",name:"餐饮2",num:1,price:30},
      {id:1004,icon:"img/4.png",name:"餐饮3",num:1,price:40},
      {id:1005,icon:"img/5.png",name:"餐饮4",num:1,price:50},
      {id:1006,icon:"img/6.png",name:"餐饮5",num:1,price:60},
      {id:1007,icon:"img/7.png",name:"餐饮6",num:1,price:70},
      {id:1008,icon:"img/8.png",name:"餐饮7",num:1,price:80},
      {id:1009,icon:"img/9.png",name:"餐饮8",num:1,price:90},
      {id:1010,icon:"img/10.png",name:"餐饮9",num:1,price:100}
    ];
    data.forEach(function (item) {
      item.num=parseInt(Math.random()*9+1);
      item.sum=item.num*item.price;
    });
    console.log(data);</span><span style="color: rgba(0, 128, 0, 1)">*/</span>


    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">// 修改数组中的每个值
    var arr=;
    arr.forEach(function (t,i,arr) {
      //t++;   //错误
      //arr++;    //数组中每一项

      //将所有偶数+1
      if(t%2===0){
            arr++;
      }
    });
    console.log(arr);</span><span style="color: rgba(0, 128, 0, 1)">*/</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>5. for of (ES6)</h2>
<p>for of 循环是 Es6 中新增的语句,用来替代 for in 和 forEach,<span style="color: rgba(255, 0, 0, 1)"><strong>不允许遍历 对象</strong></span><br>它<span style="color: rgba(255, 0, 0, 1)"><strong>允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代(Iterable data)的数据结构</strong></span>,注意它的兼容性。</p>
<div class="cnblogs_code">
<pre>&lt;script&gt;
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> for of 循环是 Es6 中新增的语句,用来替代 for in 和 forEach,不允许遍历 对象</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 它允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代(Iterable data)的数据结构,注意它的兼容性。</span>

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">注意:1、 for(var k of arr) 中的 k ,就是数组 arr 中的元素,而不是数组的下标。
      2、 IE 不支持,Edge支持。</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">

    let arr </span>= ['name','age'<span style="color: rgba(0, 0, 0, 1)">];
    </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(let i of arr){
      console.log(i)
    }
    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(let i of 'zhejiang'<span style="color: rgba(0, 0, 0, 1)">){
      console.log(i);
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">// 不能遍历对象,下面写法错误
    let obj1 = {name:'xiong',age:18};
    for(let i of obj1){
      console.log(i);
    }</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
&lt;/script&gt;</pre>
</div>
<h2><strong>6. Array map()方法</strong></h2>
<p>map()与forEach相似,可以完成forEach的所有功能。</p>
<ul>
<li>&nbsp;map() 返回一个新数组。</li>
<li>&nbsp;map() 不会对空数组进行检测。</li>
<li>&nbsp;map() 不会改变原始数组。</li>
</ul>
<p>注意:map 和 forEach 方法都是只能用来遍历数组,不能用来遍历普通对象。</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">map()遍历</span>
    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">var arr = ;
    arr.map(function (t) {
      console.log(t);   //1 2 4 6 7 8 5 9
    });</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">// map()与forEach相似,可以完成forEach的所有功能
    var data = [
      {id: 1001, icon: "img/1.png", name: "餐饮0", num: 1, price: 10},
      {id: 1002, icon: "img/2.png", name: "餐饮1", num: 1, price: 20},
      {id: 1003, icon: "img/3.png", name: "餐饮2", num: 1, price: 30},
      {id: 1004, icon: "img/4.png", name: "餐饮3", num: 1, price: 40},
      {id: 1005, icon: "img/5.png", name: "餐饮4", num: 1, price: 50},
      {id: 1006, icon: "img/6.png", name: "餐饮5", num: 1, price: 60},
      {id: 1007, icon: "img/7.png", name: "餐饮6", num: 1, price: 70},
      {id: 1008, icon: "img/8.png", name: "餐饮7", num: 1, price: 80},
      {id: 1009, icon: "img/9.png", name: "餐饮8", num: 1, price: 90},
      {id: 1010, icon: "img/10.png", name: "餐饮9", num: 1, price: 100}
    ];
    data.map(function (item) {
      item.num = parseInt(Math.random() * 9 + 1);
      item.sum = item.num * item.price;
    });
    console.log(data);</span><span style="color: rgba(0, 128, 0, 1)">*/</span>

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">// 每个元素+1,返回给新数组
    var arr=;
    var arr1=arr.map(function (t) {
      return ++t;
    });
    console.log(arr,arr1);</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
   

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
   return 返回数据元素,到新数组中,如果不返回的数据就会变成undefined
    var arr=;
      arr=arr.map(function (t) {
          if(t%2===0){
            return t+1;
          }
          return t;      //如果没有这句,非奇数的返回为undefined
      });
       console.log(arr);</span><span style="color: rgba(0, 128, 0, 1)">*/</span>


    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">map() 和 forEach() 的区别
    *   forEach遍历当前数组,没有返回值,不会返回新数组
    *   map遍历当前数组,并且将当前数组中的元素返回给新数组,
    * 不使用return时,新数组的长度与原数组相同,但是每个元素都是undefined;
    * </span><span style="color: rgba(0, 128, 0, 1)">*/</span></pre>
</div>
<h2>7.&nbsp;<strong>Array filter() 方法</strong></h2>
<p>filter 方法是 Array对象内置方法,它会返回通过过滤的元素,不改变原来的数组。<br><br>filter() 方法<strong>返回一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素</strong>。</p>
<div class="cnblogs_code"><img id="code_img_closed_a7378aa7-d2bc-4732-a19c-4be4ba15be72" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_a7378aa7-d2bc-4732-a19c-4be4ba15be72" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_a7378aa7-d2bc-4732-a19c-4be4ba15be72" class="cnblogs_code_hide">
<pre>&lt;script&gt;
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> filter 方法是 Array对象内置方法,它会返回通过过滤的元素,不改变原来的数组。</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> filter() 方法返回一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。</span>
<span style="color: rgba(0, 0, 0, 1)">
    let arr </span>= ;
    let tt </span>= arr.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(i){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> i&gt;1<span style="color: rgba(0, 0, 0, 1)">;
    });
    console.log(tt);    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span>
    console.log(arr);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span>

    <span style="color: rgba(0, 0, 255, 1)">var</span> arr1 = ['A', 'B', 'C'<span style="color: rgba(0, 0, 0, 1)">];
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> r = arr1.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (element, index, self) {
      console.log(element); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 依次打印'A', 'B', 'C'</span>
      console.log(index); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 依次打印0, 1, 2</span>
      console.log(self); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> self就是变量arr1</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    });


    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 利用filter,可以巧妙地去除Array的重复元素:</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 去除重复元素依靠的是indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> r, arr2 = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'<span style="color: rgba(0, 0, 0, 1)">];
    r </span>= arr2.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (element,index, self) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> self.indexOf(element) ===<span style="color: rgba(0, 0, 0, 1)"> index;
    });
    console.log(r);



    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用filter()筛选出1-100之间所有素数:</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> get_primes(arr) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> i;
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> arr.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (element) {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> flag=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(element&lt;2<span style="color: rgba(0, 0, 0, 1)">){
                flag</span>=<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i=2;i&lt;element;i++<span style="color: rgba(0, 0, 0, 1)">){
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (element%i==0<span style="color: rgba(0, 0, 0, 1)">){
                        flag</span>=<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                        </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> flag;
      });
    }

    </span><span style="color: rgba(0, 0, 255, 1)">var</span> arr3 =<span style="color: rgba(0, 0, 0, 1)"> [];
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> x = 1; x &lt; 100; x++<span style="color: rgba(0, 0, 0, 1)">) {
      arr3.push(x)
    }
    console.log(get_primes(arr3));</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"></span>
&lt;/script&gt;</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>&nbsp;8.&nbsp;<strong>Array some() 方法</strong></h2>
<p>some() 方法<span style="color: rgba(255, 0, 0, 1)"><strong>用于检测数组是否<span style="font-size: 16px"><span style="text-decoration: underline">存在元素</span>满足指定条件(函数提供)</span>。只要有一个元素满足则返回true,并不再继续往下判断,不改变原数组。</strong></span></p>
<div class="cnblogs_code">
<pre>let arr = ;
let tt </span>= arr.some(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(i){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> i&gt;1<span style="color: rgba(0, 0, 0, 1)">;
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测数组中元素是否都大于1</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> true</span></pre>
</div>
<p>详细用法介绍:</p>
<div class="cnblogs_code"><img id="code_img_closed_9d78e033-1f31-4475-a885-351df26430f1" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_9d78e033-1f31-4475-a885-351df26430f1" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_9d78e033-1f31-4475-a885-351df26430f1" class="cnblogs_code_hide">
<pre>&lt;script&gt;
    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
   // some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。只要有一个元素满足则返回true,并不再继续往下判断。
    // arr.some(callback(element[, index[, array]])[, thisArg])
    let arr = ;
    let tt = arr.some(function(i){
      return i&gt;1;
    });
    console.log(tt);    //false</span><span style="color: rgba(0, 128, 0, 1)">*/</span>


    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">const a = ;
    const arr1 = [];
    let ret1 = a.some((item, index, array) =&gt; {
      console.log(item, index, array);
      if (item &gt; 80) {
            return arr1.push(item);
      }
    });
    console.log('ret1===&gt;',ret1);   //ret1===&gt; true
    console.log('arr1---',arr1);    //arr1--- </span><span style="color: rgba(0, 128, 0, 1)">*/</span>


    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> function isBiggerThan10(element, index, array) {</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   return element &gt; 10;</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> }</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> .some(isBiggerThan10); // false</span>


    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">二、 判断数组元素中是否存在某个值</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模仿 includes()方法, 若元素在数组中存在, 则回调函数返回值为 true :</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> fruits = ['apple', 'banana', 'mango', 'guava'<span style="color: rgba(0, 0, 0, 1)">];
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> fruitsNew =<span style="color: rgba(0, 0, 0, 1)"> [];

    </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> checkAvailability1(arr, val) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> arr.some(item =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            console.log(item);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> val ==<span style="color: rgba(0, 0, 0, 1)"> item
      })
    }

    console.log(checkAvailability1(fruits, </span>'kela')); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false</span>
    console.log(checkAvailability1(fruits, 'banana')); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> true</span>


    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 三、根据条件截取更新数据</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> checkAvailability2(val) {
      fruits.some((item, i) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (item ==<span style="color: rgba(0, 0, 0, 1)"> val) {
                fruits.splice(i, </span>1<span style="color: rgba(0, 0, 0, 1)">)
            }
      })
    }
    checkAvailability2(</span>'banana'<span style="color: rgba(0, 0, 0, 1)">);
    console.log(fruits);    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">["apple", "mango", "guava"]</span>

&lt;/script&gt;</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>9.&nbsp;<strong>Array every() 方法</strong></h2>
<p>every() 方法<span style="color: rgba(255, 0, 0, 1)"><strong>用于检测数组中是否<span style="font-size: 16px"><span style="text-decoration: underline">所有元素</span>都符合指定条件</span>(通过函数提供),返回 boolen。</strong></span></p>
<div class="cnblogs_code">
<pre>let arr = ;
let tt </span>= arr.every(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(i){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> i&gt;1<span style="color: rgba(0, 0, 0, 1)">;
})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false</span></pre>
</div>
<p>详细用法介绍:</p>
<div class="cnblogs_code"><img id="code_img_closed_6f763ef2-acb2-46b3-8564-0c05f9c30cfd" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_6f763ef2-acb2-46b3-8564-0c05f9c30cfd" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_6f763ef2-acb2-46b3-8564-0c05f9c30cfd" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true。</span>

    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> isBigEnough(element, index, array) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> (element &gt;= 10<span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">var</span> passed = .every(isBigEnough);
    console.log(passed);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查数组每一项 是否都是偶数</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> CheckIfEven(value, index){
      console.log(value);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(value % 2 == 0<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> '偶数';      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">回到函数的返回值没有必要非得是true本身,只要可以转换为true即可,对于false也是如此。</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }
    let numbers</span>=;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(numbers.every(CheckIfEven)){
      console.log(</span>"全都是偶数"<span style="color: rgba(0, 0, 0, 1)">);
    }
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
      console.log(</span>"不全都是偶数"<span style="color: rgba(0, 0, 0, 1)">);
    }</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>10. JQuery方法 $.each</h2>
<p>each() 方法为每个匹配元素规定要运行的函数。JQuery的each方法<span style="color: rgba(255, 0, 0, 1)"><strong>既可以遍历数组,也可以遍历对象。在遍历对象时可以很容易获取对象属性名</strong></span>。</p>
<p>语法:jQuery.each(object, )</p>
<p>回调函数拥有两个参数:<strong>第一个为对象的成员或数组的索引,第二个为对应变量或内容</strong>。如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。</p>
<p>示例1 遍历数组:</p>
<p><img src="https://img-blog.csdn.net/20170905234601378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>示例2 遍历对象</p>
<p><img src="https://img-blog.csdn.net/20170905234644406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;</p>
<p>原生方法实现如下:</p>
<div class="cnblogs_code"><img id="code_img_closed_f0197d63-4534-4e54-975b-ccf3a93db2a9" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_f0197d63-4534-4e54-975b-ccf3a93db2a9" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_f0197d63-4534-4e54-975b-ccf3a93db2a9" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过字面量方式实现的函数each</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> each =<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(object, callback){
</span><span style="color: rgba(0, 0, 255, 1)">var</span> type = (<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
          </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (object.constructor){
            </span><span style="color: rgba(0, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 0, 1)"> Object:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> 'Object'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 0, 1)"> Array:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> 'Array'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 0, 1)"> NodeList:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> 'NodeList'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> 'null'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    })();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 为数组或类数组时, 返回: index, value</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(type === 'Array' || type === 'NodeList'<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 由于存在类数组NodeList, 所以不能直接调用every方法</span>
      [].every.call(object, <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(v, i){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> callback.call(v, i, v) === <span style="color: rgba(0, 0, 255, 1)">false</span> ? <span style="color: rgba(0, 0, 255, 1)">false</span> : <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      });
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 为对象格式时,返回:key, value</span>
    <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(type === 'Object'<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> object){
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(callback.call(object, i, object) === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">){
                </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">原生JS仿写jquery 实现$.each() </span></div>
<p>测试下:</p>
<p>&nbsp;</p>
<p>数组类型:</p>
<p><img src="https://img-blog.csdn.net/20170905235719260?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>对象类型:</p>
<p><img src="https://img-blog.csdn.net/20170905235929428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>类数组类型:<br><img src="https://img-blog.csdn.net/20170906000106247?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;</p>
<p>增加退出循环条件:</p>
<div class="cnblogs_code"><img id="code_img_closed_aa0acd93-a89a-40f0-89e2-47b9f30c2d6e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_aa0acd93-a89a-40f0-89e2-47b9f30c2d6e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_aa0acd93-a89a-40f0-89e2-47b9f30c2d6e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> obj= {name:'box', color: 'red', size:'big', number: '100'<span style="color: rgba(0, 0, 0, 1)">,}
each(obj, </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(i, v){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(i === 'color'<span style="color: rgba(0, 0, 0, 1)">){
    console.log(</span>'箱子的颜色是,'+v+''<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(i === 'size' &amp;&amp; v=== 'big'<span style="color: rgba(0, 0, 0, 1)">){
    console.log(</span>'型号,数量符合收货'<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
console.log(i </span>+ ': ' +<span style="color: rgba(0, 0, 0, 1)"> v);
});</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><br><img src="https://img-blog.csdn.net/20170906001217618?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzI1NDYxNTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<p>&nbsp;</p>
<pre><code class="hljs kotlin"></code></pre>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/XJT2018/p/11283609.html
頁: [1]
查看完整版本: 【前端-JavaScript】10种遍历方法