/* 休眠函数 */const sleep = (timeout = 2000) => { return new Promise((resolve) => { setTimeout(() => resolve([]), timeout); })}/* 数组 reduce() 的各种用法 *//* 累加,累乘 */function Accumulation(...vals) { return vals.reduce((t, c) => t + c, 0)}function Multiplication(...vals) { return vals.reduce((t, c) => t * c, 1)}// console.log(`累加`, Accumulation(1, 2, 3)) // 累加 6// console.log(`累乘`, Multiplication(1, 2, 3)) // 累乘 6/* 权重求和 */var scores = [ { score: 90, subject: "chinese", weight: 0.5 }, { score: 95, subject: "math", weight: 0.3 }, { score: 85, subject: "english", weight: 0.2 }]var result = scores.reduce((t, c) => t + c.score * c.weight, 0) // 90.5/* 代替reverse 逗号操作符 对它的每个操作数求值(从左到右),并返回最后一个操作数的值。*/function Reverse(list = []) { // return list.reduce((t, c) => (t.unshift(c), t), []) return list.reduceRight((t, c) => (t.push(c), t), [])}// console.log(Reverse([12, 34, 56])) // [ 56, 34, 12 ]/* 代替map和filter */var arr = [0, 1, 2, 3];// 代替map:[0, 2, 4, 6]var a = arr.map(i => i * 2)var b = arr.reduce((t, c) => [...t, c * 2], [])// 代替filter:[2, 3]var c = arr.filter(i => i > 1)var d = arr.reduce((t, c) => c > 1 ? [...t, c] : t, [])// 代替map和filter:[4, 6]var e = arr.map(i => i * 2).filter(i => i > 2)var f = arr.reduce((t, c) => c * 2 > 2 ? [...t, c * 2] : t, [])/* 代替some和every */var scores = [ { score: 45, subject: "chinese" }, { score: 90, subject: "math" }, { score: 60, subject: "english" }]// 代替some:至少一门合格var isAtLeastOneQualified = scores.reduce((t, c) => t || c.score >= 60, false) // true// 代替every:全部合格var isAllQualified = scores.reduce((t, c) => t && c.score >= 60, true) // false/* 数组分割 */var arr = [1, 2, 3, 4, 5]function Chunk(arr = [], size = 1) { return arr.length ? arr.reduce( (t, v) => ( t[t.length - 1].length === size ? t.push([v]) : t[t.length - 1].push(v), t ), [[]] ) : [];}// console.log(Chunk(arr, 2)) // [ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]/* 数组过滤 两个数组,参照某个数组过滤另一个数组 代码中:交集 扩展:并集、差集*/var arr1 = [1, 2, 3, 4]var arr2 = [2, 3, 7, 8]function Difference(arr = [], oarr = []) { return arr.reduce((t, c) => (oarr.includes(c) && t.push(c), t), [])}// console.log(Difference(arr1, arr2)) // [ 2, 3 ]/* 数组填充 替换数组中指定位置元素*/function Fill(arr = [], val = '', start = 0, end = arr.length) { if (start < 0 || start >= end || end > arr.length) return arr return [ ...arr.slice(0, start), ...arr.slice(start, end).reduce((t, c) => (t.push(val || c), t), []), ...arr.slice(end, arr.length) ]}var arr = [0, 1, 2, 3, 4, 5, 6]// console.log(JSON.stringify(Fill(arr, 'aaa', 1, 5))) // [0,"aaa","aaa","aaa","aaa",5,6]/* 数组扁平 */function Flat(arr = []) { return arr.reduce((t, c) => t.concat(Array.isArray(c) ? Flat(c) : c), [])}/* 数组去重 */function Uniq(arr = []) { return arr.reduce((t, c) => t.includes(c) ? t : [...t, c], [])}/* 数组最大最小值 */function Max(arr = []) { return arr.reduce((t, c) => t > c ? t : c)}function Min(arr = []) { return arr.reduce((t, c) => t < c ? t : c)}var arr = [12, 45, 21, 65, 38, 76, 108, 43];// console.log(Max(arr), Min(arr)) // 108 12/* 数组成员独立拆解 */var arr = [['a', 1, true], ['b', 2, false]] // [['a', 'b'], [1, 2], [true, false]]function Unzip(arr = []) { return arr.reduce( (t, c) => (c.forEach((item, index) => t[index].push(item)), t), Array.from({ length: Math.max(...arr.map(c => c.length)) }).map(() => []) )}/* 数组成员的个数统计 */function Count(arr = []) { return arr.reduce((t, c) => (t[c] = (t[c] || 0) + 1, t), {})}/* 数组成员位置记录 */var arr = [2, 1, 5, 4, 2, 1, 6, 6, 7] // [ 0, 4 ]function Position(arr = [], target) { return arr.reduce((t, c, i) => (c === target && t.push(i), t), [])}/* 数组成员特性分组 */var arr = [ { area: "GZ", name: "YZW", age: 27 }, { area: "GZ", name: "TYJ", age: 25 }, { area: "SZ", name: "AAA", age: 23 }, { area: "FS", name: "BBB", age: 21 }, { area: "SZ", name: "CCC", age: 19 }]; // 以地区area作为分组依据// Group(arr, "area") 结果是: { GZ: Array(2), SZ: Array(2), FS: Array(1) }function Group(arr = [], key) { return key ? arr.reduce((t, c) => (!t[c[key]] && (t[c[key]] = []), t[c[key]].push(c), t), {}) : {}}/* 数组成员所含关键字统计 */var text = [ "今天天气真好,我想出去钓鱼", "我一边看电视,一边写作业", "小明喜欢同桌的小红,又喜欢后桌的小君,真TM花心", "最近上班喜欢摸鱼的人实在太多了,代码不好好写,在想入非非"];var keyword = ["偷懒", "喜欢", "睡觉", "摸鱼", "真好", "一边", "明天"];// Keyword(text, keyword); // ["喜欢", "摸鱼", "真好", "一边"]function Keyword(arr = [], keys = []) { return keys.reduce((t, c) => (arr.some(w => w.includes(c)) && t.push(c), t), [])}/* 字符串翻转 */var str = "reduce最牛逼";// ReverseStr(str); // "逼牛最ecuder"function ReverseStr(str) { return str.split('').reduceRight((t, c) => t + c)}/* ! 数字千分化*/// ThousandNum(1234); // "1,234"// ThousandNum(1234.00); // "1,234"// ThousandNum(0.1234); // "0.123,4"// ThousandNum(1234.5678); // "1,234.567,8"function ThousandNum(num = 0) { const str = (+num).toString().split('.') const int = nums => nums.split('').reverse().reduceRight((t, c, i) => t + (i % 3 ? c : `${c},`), '').replace(/^,|,$/g, '') const dec = nums => nums.split('').reduce((t, c, i) => t + ((i + 1) % 3 ? c : `${c},`), '').replace(/^,|,$/g, '') return str.length > 1 ? `${int(str[0])}.${dec(str[1])}` : int(str[0])}/* ! 异步累计*/// const result = await AsyncTotal(); // 需要在async包围下使用async function AsyncTotal(arr = []) { return arr.reduce(async(t, c) => { const at = await t; const todo = await Todo(c); at[c] = todo; return at }, Promise.resolve({}))}async function name(params) { const result = await AsyncTotal() console.log(result)}/* 斐波那契数列 */// Fibonacci(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]function Fibonacci(len = 2) { const arr = [...new Array(len).keys()] return arr.reduce((t, c, i) => (i > 1 && t.push(t[i - 1] + t[i - 2]), t), [0, 1])}/* URL参数反序列化 */// 假设URL为:https://www.baidu.com?age=25&name=TYJ// ParseUrlSearch(); // { age: "25", name: "TYJ" }function ParseUrlSearch() { return location.search.replace(/(^\?)|(&$)/g, '').split('&').reduce((t, c) => { const [key, value] = c.split('=') t[key] = decodeURIComponent(value) return t }, {})}/* URL参数序列化 */// StringifyUrlSearch({ age: 27, name: "YZW" }); // "?age=27&name=YZW"function StringifyUrlSearch(search = {}) { return Object.entries(search).reduce( (t, c) => `${t}${c[0]}=${encodeURIComponent(c[1])}&`, Object.keys(search).length ? '?' : '' ).replace(/&?/, '');}/* 返回对象指定键值 */var target = { a: 1, b: 2, c: 3, d: 4 };var keyword = ["a", "d"];// GetKeys(target, keyword); // { a: 1, d: 4 }function GetKeys(obj = {}, keys = []) { return Object.keys(obj).reduce((t, c) => (keys.includes(c) && (t[c] = obj[c]), t), {})}/* 数组转对象 */var people = [ { area: "GZ", name: "YZW", age: 27 }, { area: "SZ", name: "TYJ", age: 25 }];// {"YZW":{"area":"GZ","age":27},"TYJ":{"area":"SZ","age":25}}function ArrayToObject(arr = []) { if (!arr.length) return {} return arr.reduce((t, c) => { const { name, ...rest } = c t[name] = rest return t }, {})}/* Redux Compose函数原理 */function Compose(...funs) { if (funs.length === 0) { return arg => arg; } if (funs.length === 1) { return funs[0] } return funs.reduce((t, c) => (...args) => t(c(...args)))}