练习三、setTimeout使用闭包,判断数组某个值并进行多种方法去除

  1. 功能描述:setTimeout使用闭包,判断数组某个值并进行多种方法去除

  1. 主要考点:

2.1 setTimeout如何解决异步操作里变量混乱→(1.独立块作用域,2.使用setTimeout第三参数,3.闭包自执行匿名函数)

2.2 去除数组某个数值的方法 →(1. push(),2. spliace(), 3. ES6新增的filter过滤, 4. forEach())

  1. 框架:elementui

  1. 相关代码

<script>
export default {
  data(){
    return{

    }
  },
  mounted(){
    this.count()
    this.arrayOut()
  },
  methods:{
    count(){
      // 题目:以下输出需要为0,1,2,3,4,5
      // 分析:因为是异步操作,所以需要等待执行完每个回调函数才能进行打印操作而现在i都是固定一个值
      for(var i = 0; i < 5; i++){
        setTimeout(function(){
          console.log(i);
        },1000)
      }

      //解法一 let 是块作用域,所以会分配独立5个块,里面的变量i相互独立且不影响
      for(let i = 0; i < 5; i++){
        setTimeout(function(){
          console.log('解法一',i);
        },1000)
      }

      //解法二 setTimeout的第三个参数(先执行)回传到第一个参数,j =>{ console.log('解法二',j); }中进行执行
      for(var i = 0; i < 5; i++){
        setTimeout(j =>{
          console.log('解法二',j);
        },1000,i)
      }

      //解法三 闭包方法 (i)是立即函数,而且把全局变量i转换成局部变量i,是个封闭的作用域,内部可以访问外部变量,但反之不能,返回的变量传到j变量中
      for(var i = 0; i < 5; i++){
        (j =>{
          setTimeout(() => {
            console.log('解法三',j);
          },1000)
        })(i)

      }
    },

    // 题目:已知 var arr = [4,0,7,9,0,0,2,6,0,3,1,0];
    //      要求将数组中的 0 项去掉,将不为 0 的值存入一个新的数组,生成新的数组。
    arrayOut(){
      var arr = [4,0,7,9,0,0,2,6,0,3,1,0];

      //写法一 使用push()
      var newArr = []
      for( var count = 0 ; count<arr.length ; count++){
        if(arr[count] != 0){
          newArr.push(arr[count])
        }
      }
      console.log('替换后的数组为',newArr)

      //写法二 使用splice()
      for( var count = 0 ; count<arr.length ; count++){
        if(arr[count] == 0){
          arr.splice(count,1)
          // 原数组移出一位,需要相应地减去计数器的1位
          count--
        }
      }
      console.log('替换后的数组为',arr)

      //写法三 使用filter过滤器
      var newArr2 = arr.filter( arr => arr != 0 )
      console.log('替换后的数组为',newArr2)

      //写法四 使用forEach进行遍历
      var newArr3 = []
      arr.forEach( arr => {
        if(arr > 0){
          newArr3.push(arr)
        }
      } )
      console.log('替换后的数组为',newArr3)
    }
  }
}
</script>
### ### 使用 `reduce` 方法对 Vue 数组对象的某个属性求和 在 Vue 中,如果需要对数组对象中的某个属性进行求和,推荐使用 JavaScript 的 `reduce` 方法。这种方法能够清晰地处理数组的遍历与累加操作,同时与 Vue 的响应式系统兼容[^4]。 例如,假设有一个包含多个对象的数组 `items`,每个对象都有一个 `price` 属性,可以使用以下方式实现求和: ```javascript computed: { totalPrice() { return this.items.reduce((sum, item) => sum + item.price, 0); } } ``` 在模板中,可以直接使用 `{{ totalPrice }}` 来显示计算结果。`reduce` 方法会遍历数组中的每个元素,累加指定的属性返回最终的总和。 ### ### 使用 `map` 和 `reduce` 结合实现复杂求和 在某些情况下,可能需要先对数据进行处理,再进行求和操作。例如,从数组对象中提取特定属性求和。可以通过 `map` 配合 `reduce` 实现: ```javascript computed: { totalQuantity() { return this.products.map(product => product.quantity) .reduce((sum, quantity) => sum + quantity, 0); } } ``` 此方法首先使用 `map` 提取 `quantity` 属性,然后通过 `reduce` 对提取的进行求和。这种组合方式适用于需要对数据进行预处理后再求和的场景[^2]。 ### ### 在 Vue 中处理异步数据时的求和逻辑 如果数组数据是通过异步请求获取的,在进行求和之前需要确保数据已经加载完成。可以通过 `watch` 或 `mounted` 生命周期钩子来控制计算时机: ```javascript mounted() { this.fetchData().then(() => { this.totalPrice = this.items.reduce((sum, item) => sum + item.price, 0); }); }, methods: { fetchData() { // 模拟异步请求 return new Promise(resolve => { setTimeout(() => { this.items = [ { name: '商品A', price: 100 }, { name: '商品B', price: 200 }, { name: '商品C', price: 300 } ]; resolve(); }, 1000); }); } } ``` 通过 `mounted` 钩子,在组件加载完成后触发数据请求,在数据加载完成后计算 `totalPrice`。这种方式可以确保在数据可用时才执行求和操作,避免因数据未加载而导致计算错误[^1]。 ### ### 在公共方法使用 `reduce` 实现求和 如果需要将求和逻辑提取为公共方法,可以在 `methods` 中定义一个函数,在需要的地方调用: ```javascript methods: { calculateTotalPrice(items) { return items.reduce((sum, item) => sum + item.price, 0); } } ``` 在模板中调用: ```html <p>总价: {{ calculateTotalPrice(items) }}</p> ``` 这种方式适用于需要在多个组件中复用求和逻辑的情况。由于 `reduce` 是原生 JavaScript 方法,不会受到 Vue 的上下文限制,因此可以直接在公共方法使用[^3]。 ### ### 示例代码 以下是一个完整的 Vue 示例,展示了如何对数组对象中的某个属性进行求和: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Vue 数组求和示例</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> <p>商品列表:</p> <ul> <li v-for="item in items" :key="item.name"> {{ item.name }} - ¥{{ item.price }} </li> </ul> <p>总价: ¥{{ totalPrice }}</p> </div> <script> new Vue({ el: '#app', data: { items: [ { name: '商品A', price: 100 }, { name: '商品B', price: 200 }, { name: '商品C', price: 300 } ] }, computed: { totalPrice() { return this.items.reduce((sum, item) => sum + item.price, 0); } } }); </script> </body> </html> ``` 在这个示例中: - `items` 是一个包含多个商品对象的数组。 - `totalPrice` 是一个计算属性,通过 `reduce` 方法计算 `price` 属性的总和。 - 在模板中,通过 `{{ totalPrice }}` 显示总价。 通过上述方法,可以在 Vue 中高效地实现数组对象中某个属性的求和操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值