/* 休眠函数 */
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)))
}