📒 JS 相关技巧
// 1. 数组转对象
const dict: Record<number, boolean> = Object.fromEntries(
array.map(i => [i, true])
)
// 2. 使用 Array.from 初始化数组
const digits = Array.from({ length: 10 }, (_, i) => i);
// 3. 字符串转数组,然后用数组方法遍历
// 常规方法是用 split()
String(num).split("").reduce(...)
// 由于字符串实现了 iterator 接口,因此可以使用扩展运算符展开到数组中
[...String(num)].reduce(...)
📒 TS 类型体操性能分析
$ tsc index.ts –-diagnostics
📒 前端动画实现方案
- CSS 方案:
transition
、animation
- JS 方案:
setTimeout
、requestAnimationFrame
一个实验性 API Element.animate()
,可以在渲染进程的时候就执行,性能更好。
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/animate
📒 血泪教训之请不要再轻视Git —— 我在工作中是如何使用 Git 的
📒 https://nextjs.org/learn/basics/create-nextjs-app
📒 手把手教你用神器nextjs一键导出你的github博客文章生成静态html
📒 Golang 三数之和
package algorithm
import (
"sort"
)
func ThreeSum(nums []int) [][]int {
ans := make([][]int, 0)
// 数组元素个数小于 3,直接返回
if len(nums) < 3 {
return ans
}
// 排序
sort.Ints(nums)
// 遍历到倒数第二个,因为是三个数总和
for i := 0; i < len(nums) - 2; i++ {
// 规定 nums[i] < nums[left] < nums[right]
// 如果 nums[i] > 0 则不存在另外两个值使得相加等于 0
// 大于 0 可以直接跳出循环了
if nums[i] > 0 {
break
}
// 过滤 nums[i] 重复
if i > 0 && nums[i] == nums[i-1] {
continue
}
// 先确定一个值 nums[i]
// 再去找另外两个值 nums[left] 和 nums[right]
// 需要满足 nums[i] < nums[left] < nums[right]
target := -nums[i]
left, right := i + 1, len(nums) - 1
// 使用双指针法确定剩下两个值
for left < right {
sum := nums[left] + nums[right]
if sum < target {
left++
} else if sum > target {
right--
} else if sum == target {
ans = append(ans, []int{nums[i], nums[left], nums[right]})
// 找到目标值,左右指针分别移动一位
left++
right--
// 过滤 nums[left] 重复
for left < right && nums[left] == nums[left-1] {
left++
}
// 过滤 nums[right] 重复
for left < right && nums[right] == nums[right+1] {
right--
}
}
}
}
return ans
}
📒 Golang 手写数组方法
package main
import (
"fmt"
)
func ForEach(nums []int, fn func(int, int)) {
for index, item := range nums {
fn(item, index)
}
}
func Map(nums []int, fn func(int, int) int) []int {
res := make([]int, 0)
for index, item := range nums {
res = append(res, fn(item, index))
}
return res;
}
func Filter(nums []int, fn func(int, int) bool) []int {
res := make([]int, 0)
for index, item := range nums {
if fn(item, index) {
res = append(res, item)
}
}
return res
}
func Reduce(nums []int, fn func(int, int, int) int, initValue int) int {
res := initValue
for index, item := range nums {
res = fn(res, item, index)
}
return res
}
func main() {
s := []int{1, 2, 3, 4}
ForEach(s, func(item, index int) {
fmt.Println("===forEach", item, index)
})
mapped := Map(s, func(item, index int) int {
return item * 2
})
fmt.Println(mapped)
filtered := Filter(s, func(item, index int) bool {
return item % 2 == 0
})
fmt.Println(filtered)
reduced := Reduce(s, func(accu, cur, index int) int {
return accu + cur
}, 0)
fmt.Println(reduced)
}
📒 Vue3.2 vDOM diff流程分析之一:diff算法
📒 developer-roadmap
developer-roadmap 是一个开发人员路线图,包含了前端路线图、后端路线图、DevOps 路线图、React 路线图、Angular 路线图、Android 路线图、Python 路线图、Go 路线图、Java 路线图、DBA 路线图。