functionmap(arr,callback) { // 声明空数组 let result = []; for (let i = 0;i<arr.length;i++){ // 将callback的执行结果添加到数组中 result.push(callback(arr[i],i)) } return result; }
functionreduce(arr, callback, initValue) { let result = initValue; // 执行callback for (let i = 0; i < arr.length; i++) { // 将回调函数的执行结果赋值给result result = callback(result, arr[i]); } return result; }
3.filter()
将所有在过滤函数中返回 true 的数组元素放进一个新数组中并返回
1 2 3 4 5 6 7 8 9 10 11
functionfilter(arr, callback) { // 声明空数组 let result = []; for (let i = 0; i < arr.length; i++) { // 判断回调函数的返回值 if (callback(arr[i], i)) { result.push(arr[i]) } } return result; }
4.find()
找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回 undefined
1 2 3 4 5 6 7 8 9 10 11 12
functionfind(arr, callback) { // 遍历数组 for (let i = 0; i < arr.length; i++) { // 判断执行结果 if (callback(arr[i], i)) { // 返回当前正在遍历的元素 return arr[i]; } } // 没有遇到满足条件的元素,返回undefined returnundefined; }
5.findIndex()
找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回 -1
1 2 3 4 5 6 7 8 9 10 11
functionfindIndex(arr, callback) { // 遍历数组 for (let i = 0; i < arr.length; i++) { // 判断回调函数返回值 if (callback(arr[i], i)) { return i } } // 找不到返回-1 return -1 }
6.every()
如果数组中的每个元素都满足测试函数,则返回 true,否则返回 false
1 2 3 4 5 6 7 8 9
functionevery(arr, callback) { for (let i = 0; i < arr.length; i++) { // 只有一个结果为false, 直接返回false if (!callback(arr[i], i)) { returnfalse } } returntrue }
7.some()
如果数组中至少有一个元素满足测试函数,则返回 true,否则返回 false
1 2 3 4 5 6 7 8 9
functionsome(arr, callback) { for (let i = 0; i < arr.length; i++) { // 只有一个结果为true, 直接返回true if (callback(arr[i], i)) { returntrue } } returnfalse }
8.数组去重
8.1.利用forEach()和indexOf()
本质是双重遍历, 效率差些
1 2 3 4 5 6 7 8 9
functionunique1 (arr) { const result = [] arr.forEach(item => { if (result.indexOf(item)===-1) { result.push(item) } }) return result }
8.2.利用forEach() + 对象容器
只需一重遍历, 效率高些
1 2 3 4 5 6 7 8 9 10 11
functionunique2 (arr) { const result = [] const obj = {} arr.forEach(item => { if (!obj.hasOwnProperty(item)) { obj[item] = true result.push(item) } }) return result }
8.3.利用ES6语法: from + Set 或者 … + Set
1 2 3
functionunique3 (arr) { return [...newSet(arr)] }
8.4.不使用多余空间
1 2 3 4 5 6 7 8 9 10 11
functionunique4(arr) { for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; } } } return arr; }
functionslice(arr, start, end) { // 如果当前数组为[],返回[] if (arr.length === 0) { return [] } // 如果开始位置大雨数组长度,返回[] start = start || 0 if (start >= arr.length) { return [] } // 如果结束位置大于数组长度,end更新为数组长度 end = end || arr.length if (end > arr.length) { end = arr.length; } // 如果结束位置小于等于开始位置,返回[] if (end <= start) { return [] } let result = []; // 取出下标在[start,end)之间的元素,放入result中 for (let i = start; i < end; i++) { result.push(arr[i]) } return result; }
11.数组扁平化
##11.1.递归 + concat()
1 2 3 4 5 6 7 8 9 10 11 12 13
functionflatten1(arr) { let result = []; for (let i = 0; i < arr.length; i++) { if (Array.isArray(arr[i])) { // 如果是数组,遍历 result = result.concat(flatten1(arr[i])) } else { // 不是数组,合并入result中 result = result.concat(arr[i]) } } return result; }
11.2. … + some() + concat()
1 2 3 4 5 6 7
functionflatten2(arr) { let result = [].concat(...arr) // 如果数组中存在第二级,展开合并 while (result.some(item =>Array.isArray(item))) { result = [].concat(...result) } }
12.数组分块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
functionchunk(arr, size = 1) { let result = []; let temp = []; // 遍历数组 arr.forEach(item => { if (temp.length === 0) { // 如果临时数组为空,压入结果数组中 result.push(temp) } // 将元素压入临时数组中 temp.push(item) if (temp.length === size) { // 长度满足后,清空temp temp = [] } }) return result; }