用reduce能最优雅的解决
// 在字符串中找出出现最多的字符
const str = "aabdhxjdhdddnxsbbbadsh";
const maxArr = str.split('');
const maxRes = maxArr.reduce((prev, next) => {
if (next in prev) {
prev[next]++;
} else {
prev[next] = 1;
}
return prev;
}, {});
console.log(maxRes);
类似的
// 计数,一个数字出现的次数
const arrayCounter = [2,3,5,78,9,6,5,3,2,5,3,4,5,34,54,3,45,3];
const numCounter = 3;
const resCounter = arrayCounter.reduce((prev, next) => {
if (numCounter == next) {
prev++;
}
return prev;
}, 0)
console.log(resCounter);
还有些常见的,看见了不用想reduce一把梭
// 函数的柯里化
// 函数的柯里化
const curry = (fn, arr = []) => {
return (...args) => (param => {
return param.length == fn.length ? fn(...param) : curry(fn, param)
})([...arr, ...args])
}
const plus = curry((a,b,c) => a+b+c);
console.log(plus(9)(2)(5));
// 数组的扁平化
// 数组的扁平化
const flatFn = (array) => {
return array.reduce((prev, next) => {
return prev.concat(Array.isArray(next) ? flatFn(next) : next)
}, [])
}
const flatRes = flatFn([1,2,[3,4,[5]]]);
console.log(flatRes);
// 找出出现奇数次的数字
const arrOdd = [2,5,6,5,6,8,8,8,8,9,9];
const newArrOdd = arrOdd.reduce((prev, next) => {
if (prev[next]) {
prev[next]++;
} else {
prev[next] = 1;
}
return prev;
}, {});
console.log(Object.keys(newArrOdd).find(el => newArrOdd[el]%2 != 0));
还有些简单的
// 倒序
const reverseRes = arr.reduce((prev, next) => {
prev.unshift(next);
return prev;
}, []);
console.log(reverseRes);
// 累加
let arr = [1,2,3,4,5];
const addRes = arr.reduce((prev, next) => {
return prev + next;
}, 10);
console.log(addRes);
// 数组去重
const arrRepeat = [1,3,4,6,4,35,3,32,32,3,4,4,43];
const newArrRepeat = arrRepeat.reduce((prev, next) => {
if (prev.indexOf(next) == -1) {
prev.push(next)
}
return prev;
}, []);
console.log(newArrRepeat);