美文网首页
js几种循环

js几种循环

作者: 糖醋里脊120625 | 来源:发表于2022-09-15 14:36 被阅读0次

    for、forEach、for ...of

    const list = [1, 2, 3, 4, 5, 6, 7, 8,, 10, 11];
    
    for (let i = 0, len = list.length; i < len; i++) {
      if (list[i] === 5) {
        break; // 1 2 3 4
        // continue; // 1 2 3 4 6 7 8 undefined 10 11
      }
      console.log(list[i]);
    }
    
    for (const item of list) {
      if (item === 5) {
        break; // 1 2 3 4
        // continue; // 1 2 3 4 6 7 8 undefined 10 11
      }
      console.log(item);
    }
    
    list.forEach((item, index, arr) => {
      if (item === 5) return;
      console.log(index); // 0 1 2 3 5 6 7 9 10
      console.log(item); // 1 2 3 4 6 7 8  10 11
    });
    复制代码
    

    小结
    三者都是基本的由左到右遍历数组
    forEach 无法跳出循环;for 和 for ..of 可以使用 break 或者 continue 跳过或中断。
    for ...of 直接访问的是实际元素。for 遍历数组索引,forEach 回调函数参数更丰富,元素、索引、原数组都可以获取。
    for ...of 与 for 如果数组中存在空元素,同样会执行。

    some、every

    const list = [
      { name: '头部导航', backward: false },
      { name: '轮播', backward: true },
      { name: '页脚', backward: false },
    ];
    const someBackward = list.some(item => item.backward);
    // someBackward: true
    const everyNewest = list.every(item => !item.backward);
    // everyNewest: false
    复制代码
    

    小结

    二者都是用来做数组条件判断的,都是返回一个布尔值
    二者都可以被中断
    some 若某一元素满足条件,返回 true,循环中断;所有元素不满足条件,返回 false。
    every 与 some 相反,若有益元素不满足条件,返回 false,循环中断;所有元素满足条件,返回 true。

    filter、map

    const list = [
    { name: '头部导航', type: 'nav', id: 1 },,
    { name: '轮播', type: 'content', id: 2 },
    { name: '页脚', type: 'nav', id: 3 },
    ];
    const resultList = list.filter(item => {
      console.log(item);
      return item.type === 'nav';
    });
    // resultList: [
    //   { name: '头部导航', type: 'nav', id: 1 },
    //   { name: '页脚', type: 'nav', id: 3 },
    // ]
    
    const newList = list.map(item => {
      console.log(item);
      return item.id;
    });
    // newList: [1, empty, 2, 3]
    
    // list: [
    //   { name: '头部导航', type: 'nav', id: 1 },
    //   empty,
    //   { name: '轮播', type: 'content', id: 2 },
    //   { name: '页脚', type: 'nav', id: 3 },
    // ]
    

    小结

    二者都是生成一个新数组,都不会改变原数组(不包括遍历对象数组是,在回调函数中操作元素对象)
    二者都会跳过空元素。有兴趣的同学可以自己打印一下
    map 会将回调函数的返回值组成一个新数组,数组长度与原数组一致。
    filter 会将符合回调函数条件的元素组成一个新数组,数组长度与原数组不同。
    map 生成的新数组元素是可自定义。
    filter 生成的新数组元素不可自定义,与对应原数组元素一致。

    find、findIndex

    const list = [
    { name: '头部导航', id: 1 },
    { name: '轮播', id: 2 },
    { name: '页脚', id: 3 },
    ];
    const result = list.find((item) => item.id === 3);
    // result: { name: '页脚', id: 3 }
    result.name = '底部导航';
    // list: [
    //   { name: '头部导航', id: 1 },
    //   { name: '轮播', id: 2 },
    //   { name: '底部导航', id: 3 },
    // ]
    
    const index = list.findIndex((item) => item.id === 3);
    // index: 2
    list[index].name // '底部导航';
    复制代码
    

    小结
    二者都是用来查找数组元素。
    find 方法返回数组中满足 callback 函数的第一个元素的值。如果不存在返回 undefined。
    findIndex 它返回数组中找到的元素的索引,而不是其值,如果不存在返回 -1

    reduce 很强大

    计算对象数组某一属性的总和

    const list  = [
      { name: 'left', width: 20 },
      { name: 'center', width: 70 },
      { name: 'right', width: 10 },
    ];
    const total = list.reduce((currentTotal, item) => {
      return currentTotal + item.width;
    }, 0);
    // total: 100
    复制代码
    

    对象数组的去重,并统计每一项重复次数

    const list  = [
      { name: 'left', width: 20 },
      { name: 'right', width: 10 },
      { name: 'center', width: 70 },
      { name: 'right', width: 10 },
      { name: 'left', width: 20 },
      { name: 'right', width: 10 },
    ];
    const repeatTime = {};
    const result = list.reduce((array, item) => {
      if (repeatTime[item.name]) {
        repeatTime[item.name]++;
        return array;
      }
      repeatTime[item.name] = 1;
      return [...array, item];
    }, []);
    // repeatTime: { left: 2, right: 3, center: 1 }
    // result: [
    //   { name: 'left', width: 20 },
    //   { name: 'right', width: 10 },
    //   { name: 'center', width: 70 },
    // ]
    复制代码
    

    对象数组最大/最小值获取

    const list  = [
      { name: 'left', width: 20 },
      { name: 'right', width: 30 },
      { name: 'center', width: 70 },
      { name: 'top', width: 40 },
      { name: 'bottom', width: 20 },
    ];
    const max = list.reduce((curItem, item) => {
      return curItem.width >= item.width ? curItem : item;
    });
    const min = list.reduce((curItem, item) => {
      return curItem.width <= item.width ? curItem : item;
    });
    // max: { name: "center", width: 70 }
    // min: { name: "left", width: 20 }
    

    对象遍历

    在对象遍历中,经常需要遍历对象的键、值,ES5 提供了 for...in 用来遍历对象,然而其涉及对象属性的“可枚举属性”、原型链属性等,下面将从 Object 对象本质探寻各种遍历对象的方法,并区分常用方法的一些特点。
    for in

    Object.prototype.fun = () => {};const obj = { 2: 'a', 1: 'b' };for (const i in obj) {  console.log(i, ':', obj[i]);}// 1: b// 2: a// fun : () => {} Object 原型链上扩展的方法也被遍历出来for (const i in obj) {  if (Object.prototype.hasOwnProperty.call(obj, i)) {      console.log(i, ':', obj[i]);    }}// name : a 不属于自身的属性将被 hasOwnProperty 过滤
    复制代码
    

    小结
    使用 for in 循环时,返回的是所有能够通过对象访问的、可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例。如果只需要获取对象的实例属性,可以使用 hasOwnProperty 进行过滤。

    Object.keys
    Object.prototype.fun = () => {};const str = 'ab';console.log(Object.keys(str));// ['0', '1']const arr = ['a', 'b'];console.log(Object.keys(arr));// ['0', '1']const obj = { 1: 'b', 0: 'a' };console.log(Object.keys(obj));// ['0', '1']
    复制代码
    

    小结
    用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性名组成的数组。

    Object.values
    Object.prototype.fun = () => {};const str = 'ab';console.log(Object.values(str));// ['a', 'b']const arr = ['a', 'b'];console.log(Object.values(arr));// ['a', 'b']const obj = { 1: 'b', 0: 'a' };console.log(Object.values(obj));// ['a', 'b']
    复制代码
    

    小结
    用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性值组成的数组。

    相关文章

      网友评论

          本文标题:js几种循环

          本文链接:https://www.haomeiwen.com/subject/yrnrortx.html