欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解vue數(shù)組遍歷方法forEach和map的原理解析和實際應(yīng)用

 更新時間:2018年11月15日 09:08:21   作者:Peggy7  
這篇文章主要介紹了詳解vue數(shù)組遍歷方法forEach和map的原理解析和實際應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、前言

forEach和map是數(shù)組的兩個方法,作用都是遍歷數(shù)組。在vue項目的處理數(shù)據(jù)中經(jīng)常會用到,這里介紹一下兩者的區(qū)別和具體用法示例。

二、代碼

1. 相同點

  • 都是數(shù)組的方法
  • 都用來遍歷數(shù)組
  • 兩個函數(shù)都有4個參數(shù):匿名函數(shù)中可傳3個參數(shù)item(當(dāng)前項), index(當(dāng)前項的索引), arr(原數(shù)組),還有一個可選參數(shù)this
  • 匿名函數(shù)中的this默認(rèn)是指向window的
  • 對空數(shù)組不會調(diào)用回調(diào)函數(shù)
  • 不會改變原數(shù)組(某些情況下可改變)

2. forEach

(1) 沒有返回值。

var a = [1,2,3,4,5]
var b = a.forEach((item) => {
  item = item * 2
})
console.log(b)
// undefiined

(2) 可改變原數(shù)組的情況

下面來看幾個例子:

var a = [1,2,3,4,5]
a.forEach((item) => {
  item = item * 2
})
console.log(a)
// [1,2,3,4,5]

這里原數(shù)組并沒有發(fā)生改變。

var a = [1,'1',{num:1},true]
a.forEach((item, index, arr) => {
  item = 2
})
console.log(a)
// [1,'1',{num:1},true]

這里修改item的值,依然沒有修改原數(shù)組。

var a = [1,'1',{num:1},true]
a.forEach((item, index, arr) => {
  item.num = 2
  item = 2
})
console.log(a)
// [1,'1',{num:2},true]

當(dāng)修改數(shù)組中對象的某個屬性時,發(fā)現(xiàn)屬性改變了。

為什么會這樣呢?

這里就要引入棧(stack)內(nèi)存和堆(heap)內(nèi)存的概念了,對于JS中的基本數(shù)據(jù)類型,如String,Number,Boolean,Undefined,Null是存在于棧內(nèi)存中的,在棧內(nèi)存中儲存變量名及相應(yīng)的值。而Object,Array,Function存在于堆內(nèi)存中,在堆內(nèi)存中儲存變量名及引用位置。

在第一個例子中,為什么直接修改item無法修改原數(shù)組呢,因為item的值并不是相應(yīng)的原數(shù)組中的值,而是重新建立的一個新變量,值和原數(shù)組相同。

在第二個例子中,數(shù)組中的對象的值也沒有改變,是因為新創(chuàng)建的變量和原數(shù)組中的對象雖然指向同一個地址,但改變的是新變量的值,即新對象的值為2,原數(shù)組中的對象還是{num:1}。

在第三個例子中,由于對象是引用類型,新對象和舊對象指向的都是同一個地址,所以新對象把num變成了2,原數(shù)組中的對象也改變了。

var a = [1,2,3,4,5]
a.forEach((item, index, arr) => {
  arr[index] = item * 2
})
console.log(a)
// [2,4,6,8,10]

在回調(diào)函數(shù)里改變arr的值,原數(shù)組改變了。

這個例子和例三其實同理,參數(shù)中的arr也只是原數(shù)組的一個拷貝,如果修改數(shù)組中的某一項則原數(shù)組也改變因為指向同一引用地址,而如果給參數(shù)arr賦其他值,則原數(shù)組不變。

其實想要知道參數(shù)中的item和arr是不是重新創(chuàng)建的變量,在回調(diào)函數(shù)中打印就知道了。

(3) vue中的應(yīng)用

在處理數(shù)據(jù)時我經(jīng)常用到這個方法,因為數(shù)據(jù)的傳遞以json格式,經(jīng)常會收到數(shù)組中包含許多對象的數(shù)據(jù)。而后端傳給我的數(shù)據(jù)有時候需要處理,例如把時間戳格式化為正常時間,代碼如下:

// utils.js
const formatTime = date => {
  var newDate = new Date();
  newDate.setTime(date * 1000);
  const year = newDate.getFullYear()
  const month = newDate.getMonth() + 1
  const day = newDate.getDate()
  const hour = newDate.getHours()
  const minute = newDate.getMinutes()
  const second = newDate.getSeconds()
 
  return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}

export {
  formatTime
}
// 得到的數(shù)據(jù)格式
[
  {add_time: 1541495677, balance: 14, bn: "300708", cprice: "12.39"}
]
// index.vue
import axios from 'axios'
import { formatTime } from '@/lib/utils'
export default {
  data() {
    dataList: []
  },
  methods: {
    getData() {
     axios.get('/user?ID=12345')
     .then(function (res) {
       if(res.code == 200) {
        res.data.forEach((item) => {
          item.add_time = formatTime(item.add_time)
        }
        this.dataList = res.data
       }
     })
     .catch(function (err) {
      console.log(err);
     });
    }
  }
}

這時候原始數(shù)據(jù)的值也改變了,變成了格式化后的時間。

3. map

(1) 返回一個經(jīng)過處理后的新數(shù)組,但不改變原數(shù)組的值。

var a = [1,2,3,4,5]
var b = a.map((item) => {
  return item = item * 2
})
console.log(a) // [1,2,3,4,5]
console.log(b) // [2,4,6,8,10]

(2) map中可改變原數(shù)組的情況和原理與forEach相同

(3) vue中的應(yīng)用

有這樣一個需求,充值金額需要在整數(shù)的基礎(chǔ)上隨機減去100或加上100,這時我在原始的數(shù)據(jù)基礎(chǔ)上需要一個經(jīng)過處理的新數(shù)組。

export default {
  data() {
    moneyList: [1000,2000,5000,10000,20000,50000]
  },
  computed: {
    moneyList_new() {
      return this.moneyList.map((item) => {
        const random = Math.random() > 0.5 ? 1 : -1;
        return Math.floor(Math.random()*100) * random + item;
      })
    }
  }
}

實際渲染處理過的數(shù)組就可以了~

三、結(jié)語

以上就是forEach和map的對比與實際應(yīng)用,代碼只是演示使用方法并非完全真實。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Vuex實現(xiàn)一個筆記應(yīng)用的方法

    使用Vuex實現(xiàn)一個筆記應(yīng)用的方法

    這篇文章主要介紹了使用Vuex實現(xiàn)一個筆記應(yīng)用的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例

    微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例

    這篇文章主要為大家介紹了微前端qiankun主應(yīng)用與子應(yīng)用之間的跳轉(zhuǎn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Vue基礎(chǔ)知識快速入門教程

    Vue基礎(chǔ)知識快速入門教程

    這篇文章主要介紹了Vue基礎(chǔ)知識快速入門教程,我們可以先學(xué)會用,使用一段時間之后,回頭來熟悉一下Vue框架以及它的特點,需要的朋友可以參考下
    2023-05-05
  • vue如何解決watch和methods值執(zhí)行順序問題

    vue如何解決watch和methods值執(zhí)行順序問題

    這篇文章主要介紹了vue如何解決watch和methods值執(zhí)行順序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 基于Vue單文件組件詳解

    基于Vue單文件組件詳解

    下面小編就為大家?guī)硪黄赩ue單文件組件詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue視頻播放插件vue-video-player的具體使用方法

    vue視頻播放插件vue-video-player的具體使用方法

    這篇文章主要介紹了vue視頻播放插件vue-video-player的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue init webpack myproject構(gòu)建項目 ip不能訪問的解決方法

    vue init webpack myproject構(gòu)建項目 ip不能訪問的解決方法

    下面小編就為大家分享一篇vue init webpack myproject構(gòu)建項目 ip不能訪問的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 解決vue3中使用echart報錯:Cannot read properties of undefined (reading ‘type‘)

    解決vue3中使用echart報錯:Cannot read properties of&n

    在Vue項目中使用Echarts進(jìn)行數(shù)據(jù)可視化是非常常見的需求,然而有時候在引入Echarts的過程中可能會遇到報錯,本文主要介紹了解決vue3中使用echart報錯:Cannot read properties of undefined (reading ‘type‘),感興趣的可以了解一下
    2024-01-01
  • vue基于mint-ui實現(xiàn)城市選擇三級聯(lián)動

    vue基于mint-ui實現(xiàn)城市選擇三級聯(lián)動

    這篇文章主要為大家詳細(xì)介紹了vue基于mint-ui實現(xiàn)城市選擇三級聯(lián)動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 基于webpack4+vue-cli3項目實現(xiàn)換膚功能

    基于webpack4+vue-cli3項目實現(xiàn)換膚功能

    這篇文章主要介紹了基于webpack4+vue-cli3項目的換膚功能,文中是通過scss+style-loader/useable做換膚功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07

最新評論