您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)vue中數(shù)組遍歷方法forEach和map怎么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、前言
forEach和map是數(shù)組的兩個方法,作用都是遍歷數(shù)組。在vue項目的處理數(shù)據(jù)中經(jīng)常會用到,這里介紹一下兩者的區(qū)別和具體用法示例。
二、代碼
1. 相同點
都是數(shù)組的方法
都用來遍歷數(shù)組
兩個函數(shù)都有4個參數(shù):匿名函數(shù)中可傳3個參數(shù)item(當前項), index(當前項的索引), arr(原數(shù)組),還有一個可選參數(shù)this
匿名函數(shù)中的this默認是指向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]
當修改數(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ù)組就可以了~
感謝各位的閱讀!關(guān)于“vue中數(shù)組遍歷方法forEach和map怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。