一、some() 方法用于检测数组中的元素是否满足指定条件(函数提供)
some() 方法会依次执行数组的每个元素:
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
const blobs = [
"application/x-download",
"application/vnd.ms-excel",
"application/msword",
"application/octet-stream",
];
request.interceptors.response.use(async (response, request) => {
const contentType = response.headers.get("Content-Type");
const isBlob = blobs.some((item) => contentType?.includes(item));
if (isBlob) {
request.responseType = "blob";
return response;
}
const { error, code, status, msg, data } = await response.clone().json();
if ((code === 200 || code === 202) && !error) return response;
throw {
response: {
status: code || status,
statusText: msg,
data: data,
},
};
});
return request;
}
二、还有every()方法,与some()方法相反
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
const list = [10, 12, 8, 12];
if (list.every((number) => number > 9)) {
//代码块
}
//因为8小于9 所以返回false
三、reduce() 方法
接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
语法:array.reduce( function( total, currentValue, currentIndex, arr ), initialValue )
array.reduce(callback,[initialValue])
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
注意:
1. reduce() 对于空数组是不会执行回调函数的。
2. 当提供了初始值initialValue,则第一次执行回调函数时previousvalue就是initialValue,则currentValue是数组第一项;如果没有提供初始值,则previousvalue是数组第一项,currentValue是数组第二项。
reduce的常用方法 ( 最好设置默认值 )
1. 数组求和、求乘积
let numbers = [1, 2, 3, 4, 5]
let result1 = numbers.reduce((sum, n) => sum + n, 0)
console.log(result1); // 15
// let result2 = numbers.reduce((sum, n) => sum * n)
let result2 = numbers.reduce((sum, n) => sum * n, 1)
console.log(result2); // 120
2. 累加数组中对象的值
let numberObj = [{n: 1}, {n: 2}, {n: 3}, {n: 4}, {n: 5}]
let result3 = numberObj.reduce((sum, obj) => sum + obj.n, 0)
console.log(result3); // 15
3. 计算数组中每个元素出现的次数
let colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'purple', 'red']
let countColor = colors.reduce(function(allColors, color){
if(color in allColors) {
allColors[color]++;
} else {
allColors[color] = 1;
}
return allColors;
}, {});
console.log(countColor); // {blue: 1, green: 1, indigo: 1, orange: 1, purple: 1, red: 2, yellow: 1}
4. 数组去重
let arr = [1, 2, 3, 4, 4, 1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
console.log(newArr); // [1, 2, 3, 4]
5. 二维数组变一维数组
let twoArray = [[0, 1], [2, 3], [4, 5]]
let oneArray = twoArray.reduce((arr, val) => arr.concat(val), [])
console.log(oneArray); // [0, 1, 2, 3, 4, 5]
6. 将多维数组转化为一维
let moreArr = [[0, 1], [2, 3], [4,[5,6,7]]]
const resultArr = function(moreArr){
return moreArr.reduce((pre,cur) => pre.concat(Array.isArray(cur) ? resultArr(cur) : cur), [])
}
console.log(resultArr(moreArr)); // [0, 1, 2, 3, 4, 5, 6, 7]
7. 根据属性把对象分类
let peopleInfo = [
{name: 'aaa', age: 15, sex: '男'},
{name: 'bbb', age: 16, sex: '女'},
{name: 'ccc', age: 15, sex: '女'}
]
function groupBy(objectArray, property) {
return objectArray.reduce((resultObj, obj) => {
var key = obj[property]
if(!resultObj[key]) {
resultObj[key] = []
}
resultObj[key].push(obj)
return resultObj;
}, {})
}
let peopleAgeGroup = groupBy(peopleInfo, 'age')
console.log(peopleAgeGroup); // {15: [{name: "aaa", age: 15, sex: "男"}, {name: "ccc", age: 15, sex: "女"}],16: [{name: "bbb", age: 16, sex: "女"}]}
let peopleSexGroup = groupBy(peopleInfo, 'sex')
console.log(peopleSexGroup); // {男: [{name: "aaa", age: 15, sex: "男"}], 女: [{name: "bbb", age: 16, sex: "女"}, {name: "ccc", age: 15, sex: "女"}]}
参考文献
1、JS中的some()方法_js some_沈以诚的博客-CSDN博客
2、reduce() 的常用方法_努力学习~冲鸭的博客-CSDN博客
3、JS数组reduce()方法详解及高级技巧_js reduce方法 数据库返回的数据提升 'reduce' of undefined 但是自己写_12_12 ^^ DaDa的博客-CSDN博客