一. reduce
- 定义和用法:
2. 举例:
// 求和
const list = [1, 2, 3, 4, 5]
const total = list.reduce((prev, next) => {
return prev + next;
})
// 求和
const list = [
{ subject: '语文', marks: 1 },
{ subject: '美术', marks: 2 },
{ subject: '设计', marks: 3 }
]
const total = list.reduce((prev, next) => {
return prev + next.marks;
},0)
// 数组flat处理
const list = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
const res = list.reduce((prev, next) => {
return prev.concat(next);
})
// 去重
const list = [1,2,3,4,5,1,1,1,1,33,3,3]
const res = list.reduce((prev, next) => {
if (!prev.includes(next)){
prev.push(next)
}
return prev
},[])
// 最大值
const list = [1,2,3,4,5]
const res = list.reduce((prev, next) => {
return prev > prev ? prev : next;
})
// 字符出现的次数
// reduce
const str = 'sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha';
const res = str.split('').reduce((prev,next)=> {
prev[next]? prev[next]++ : prev[next] = 1;
return prev
},{})
// 非reduce
function findMax (str) {
if (str.length === 1) {
return str
}
let charObj = {}
for (let i = 0 ; i < str.length; i++) {
!charObj[str.charAt(i)] ? charObj[str.charAt(i)]= 1 : charObj[str.charAt(i)]++
}
let maxChar = '',
maxValue = 1;
console.log(charObj)
for(let k in charObj) {
if (charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k]
}
}
return maxChar;
}
console.log(findMax(str))
// 取出数组的name值作为对象的key值
const list = [{ name: '技术', id: 1 }, { name: '设计', id: 2 }];
const res = list.reduce((prev,next)=> {
prev[next.name] = next
return prev;
}, {});
// 按照比例求和
const result = [
{ subject: 'a', score: 100 },
{ subject: 'b', score: 100 },
];
const dis = {
a: 0.5,
b: 0.3,
};
const res = result.reduce((prev,next)=> {
return dis[next.subject] * next.score + prev
},0);
// 取值 [a: 10, b: 20, c: 30]
const data = [
{
a: 10,
},
{
b: 20
},
{
c: 30
}
]
const res = data.reduce((prev, next) => {
prev[Object.keys(next)[0]] = Object.values(next)[0]
return prev
}, [])
console.log(res);
// 取值 [a: 10,ff: 50,fff: 60,b: 20,c: 30]
const data = [
{
a: 10,
ff: 50,
fff:60,
},
{
b: 20
},
{
c: 30
}
]
const result = data.reduce((arr, obj) => {
for (let key in obj) {
arr.push(`${key}: ${obj[key]}`);
}
return arr;
}, []);
console.log(result)
const output = `[${result.join(',')}]`;
console.log(output); // 输出 arr[a: 10,ff: 50,b: 20,c: 30]
例子:
let url = 'https://ali.com?a=1&b=2&c=3'
// 输出 {a:1, b: 2, c:3}
function test(url) {
const str = url.split('?')[1].split('&')
console.log(str)
const result = str.reduce((prev,next)=> {
const res = next.split('=')
console.log(res, 'res')
// prev[res][0] = [res][1]
prev[res[0]] = res[1]
return prev
}, {})
return result
}
console.log(test(url))
二. filter
- 定义和用法: filter()方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。
// 重点:新数组
const list = [1,2,3,4]
const res = list.filter((i)=> {
if (i> 2) {
return true
}
return false
})
三. 比大小
// 比较大小
const a = '10.8.66.1'
const b = '10.8.66'
function handle(a, b) {
a = a.split('.')
b = b.split('.')
const len = Math.max(a.length, b.length)
while (a.length < len) {
a.push('0')
}
console.log(a,'a')
while (b.length < len) {
b.push('0')
}
console.log(b,'b')
for (let i = 0 ; i < len; i++) {
const num1 = parseInt(a[i])
const num2 = parseInt(b[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
// function handle(a,b) {
// const a1 = a.split('.')
// const b1 = b.split('.')
// if (a1.length > b1.length) {
// return 'a大'
// } else if (a1.length < b1.length) {
// return 'b大'
// } else {
// for(let i = 0 ; i < a1.length ; i++) {
// console.log(+a1[i], 'i')
// console.log(+b1[i], 'b')
// if (+a1[i] > +b1[i]) {
// return 'a大'
// } else if (+a1[i] < +b1[i]) {
// return 'b大'
// }
// }
// return '一样大'
// }
// }
四. 一些方法
// 去前后空格
function deleteSpace(str) {
if (str) {
str = str.toString();
return str.replace(/(^\s*)|(\s*$)/g, '');
}
return null;
}
// 数组去重,去空格,转成number
function arrayNumberUnique(arr) {
const json = {};
const arrResult = [];
for (let i = 0; i < arr.length; i++) {
arr[i] = deleteSpace(arr[i]);
if (arr[i] !== '' && arr[i] !== null) {
if (!json[arr[i]]) {
const reg = /^\d*$/g;
if (reg.test(arr[i])) {
arrResult.push(+arr[i]);
json[arr[i]] = 1;
} else {
return {
data: [],
code: -1,
};
}
}
}
}
return {
data: arrResult,
code: 0,
};
}
// 判断是否为数字
function number(num) {
const reg = /^\d*$/g;
if (reg.test(num)) {
return true;
}
return false;
}
// string转成number
function strToNumber(arr) {
const result = [];
arr.forEach(item => {
if (item !== '' && item !== null) {
result.push(+item);
}
});
return result;
}
// 找出数组重复元素
function duplicates(arr) {
const result = [];
arr.forEach(item => {
if (arr.indexOf(item) !== arr.lastIndexOf(item) && result.indexOf(item) === -1) {
result.push(item);
}
});
return result;
}
// 数组去空格,判断是否重复,转成number code:-1 格式有误 code:-2 重复数值 isCheckDuplicate:是否检查重复
function arrayNumber(arr, isCheckDuplicate = true) {
let result = [];
for (let i = 0; i < arr.length; i++) {
arr[i] = deleteSpace(arr[i]);
if (arr[i] !== '' && arr[i] !== null) {
if (!number(arr[i])) {
return {
data: result,
code: -1,
};
}
}
}
arr = strToNumber(arr);
result = duplicates(arr);
if (result.length && isCheckDuplicate) {
return {
data: result,
code: -2,
};
}
return {
data: arr,
code: 0,
};
}