關(guān)于forEach
forEach()方法需要一個(gè)回調(diào)函數(shù)(這種函數(shù)记某,是由我們創(chuàng)建但是不由我們調(diào)用的)作為參數(shù)
回調(diào)函數(shù)中傳遞三個(gè)參數(shù):
第一個(gè)參數(shù)司训,就是當(dāng)前正在遍歷的元素
第二個(gè)參數(shù),就是當(dāng)前正在遍歷的元素的索引
第三個(gè)參數(shù)液南,就是正在遍歷的數(shù)組
缺點(diǎn): 不能使用break和continue
let myArr = ['王一', '王二', '王三'];
myArr.forEach((item, index, arr) => {
console.log('item:' + item);
console.log('index:' + index);
console.log('arr:' + JSON.stringify(arr));
});
結(jié)果:
item:王一
index:0
arr:["王一","王二","王三"]
----------
item:王二
index:1
arr:["王一","王二","王三"]
----------
item:王三
index:2
arr:["王一","王二","王三"]
----------
注意:forEach() 沒有返回值壳猜。也可以理解成:forEach() 的返回值是 undefined
即 let tempArry = myArr.forEach() 這種方式接收是沒有意義的
forEach() 能不能改變原數(shù)組?
- 數(shù)組的元素是基本數(shù)據(jù)類型:(無法改變原數(shù)組)
let numArr = [1, 2, 3];
numArr.forEach((item) => {
item = item * 2;
});
console.log(numArr); // 打印結(jié)果:[1, 2, 3]
- 數(shù)組的元素是引用數(shù)據(jù)類型:(直接修改整個(gè)元素對象時(shí)滑凉,無法改變原數(shù)組)
let objArr = [
{ name: '云牧', age: 20 },
{ name: '許嵩', age: 30 },
];
objArr.forEach((item) => {
item = {
name: '鄧紫棋',
age: '29',
};
});
console.log(JSON.stringify(objArr));
// 打印結(jié)果:[{"name": "云牧","age": 20},{"name": "許嵩","age": 30}]
- 數(shù)組的元素是引用數(shù)據(jù)類型:(修改元素對象里的某個(gè)屬性時(shí)统扳,可以改變原數(shù)組)
let objArr = [
{ name: '云牧', age: 28 },
{ name: '許嵩', age: 30 },
];
objArr.forEach((item) => {
item.name = '鄧紫棋';
});
console.log(JSON.stringify(objArr));
// 打印結(jié)果:[{"name":"鄧紫棋","age":28},{"name":"鄧紫棋","age":30}]
如果你需要通過 forEach 修改原數(shù)組,建議用 forEach 里面的參數(shù) 2 和參數(shù) 3 來做
forEach() 通過參數(shù) 2畅姊、參數(shù) 3 修改原數(shù)組:(標(biāo)準(zhǔn)做法)
// 1咒钟、數(shù)組的元素是基本數(shù)據(jù)類型
let numArr = [1, 2, 3];
numArr.forEach((item, index, arr) => {
arr[index] = arr[index] * 2;
});
console.log(JSON.stringify(numArr)); // 打印結(jié)果:[2, 4, 6]
// 2、數(shù)組的元素是引用數(shù)據(jù)類型時(shí)若未,直接修改對象
let objArr = [
{ name: '云牧', age: 28 },
{ name: '許嵩', age: 34 },
];
objArr.forEach((item, index, arr) => {
arr[index] = {
name: '小明',
age: '10',
};
});
console.log(JSON.stringify(objArr));
// 打印結(jié)果:[{"name":"小明","age":"10"},{"name":"小明","age":"10"}]
// 3朱嘴、數(shù)組的元素是引用數(shù)據(jù)類型時(shí),修改對象的某個(gè)屬性
let objArr2 = [
{ name: '云牧', age: 28 },
{ name: '許嵩', age: 34 },
];
objArr2.forEach((item, index, arr) => {
arr[index].name = '小明';
});
console.log(JSON.stringify(objArr2));
// 打印結(jié)果:[{"name":"小明","age":28},{"name":"小明","age":34}]
map映射
遍歷數(shù)據(jù)并返回一個(gè)新的數(shù)組粗合,對數(shù)據(jù)的處理會(huì)返回原先對應(yīng)的位置
let newData = data.list.map((item, index) => {
return {
id: item.id,
title: item.title,
price: item.price * 0.6
}
})
console.log(newData);
let newData = data.list.map((item, index) => {
let {id,title,price} = item;
return {id,title,price: price * 0.6}
})
console.log(newData);
filter
返回符合條件的記錄
return true,則把當(dāng)前記錄存入新數(shù)組萍嬉,否則不存
let newData = data.list.filter((item, index) => {
return item.price > 400
})
console.log(newData);
some
如果有符合條件的記錄乌昔,則返回真,否則返回假
let newData = data.list.some((item, index) => {
console.log(index);
return item.price == 400
})
console.log(newData);
every
如果每一個(gè)都符合條件帚湘,則返回真玫荣,否則返回假
let newData = data.list.every((item, index) => {
console.log(index);
return item.price > 600
})
console.log(newData);
reduce
常用來實(shí)現(xiàn)累加
// let arr = [300, 600, 200, 100]
// 首次調(diào)用時(shí),sum是第一個(gè)元素,val是第二個(gè)元素大诸,index是1
// 再次調(diào)用時(shí),sum是上一次return的結(jié)果贯卦,val依次是下一個(gè)元素
let result = arr.reduce((sum, val, index) => {
// console.log(sum, val, index);
return sum + val;
})
console.log(result);
// 第二個(gè)參數(shù)是sum的初值资柔, 則第一次調(diào)用 時(shí), val是第一個(gè)元素
let result = data.list.reduce((sum, val, index) => {
return sum + val.price;
}, 0)
console.log(result);