22outline : deep
33---
44
5- ### 实现promise.all/allSettled
6- * 接收一个可迭代对象
7- * 传入的数据中可以是普通数据,也可以是Promise对象
8- * 可迭代对象的promise是并行执行的
9- * 保持输入数组的顺序和输出数组的顺序一致
10- * 传入数组中只要有一个reject,立即返回reject
11- * 所有数据resolve之后返回结果
5+ ### 实现 promise.all/allSettled
6+
7+ - 接收一个可迭代对象
8+ - 传入的数据中可以是普通数据,也可以是 Promise 对象
9+ - 可迭代对象的 promise 是并行执行的
10+ - 保持输入数组的顺序和输出数组的顺序一致
11+ - 传入数组中只要有一个 reject,立即返回 reject
12+ - 所有数据 resolve 之后返回结果
1213
1314``` js
14- function myPromiseAll (promises ){
15- return new Promise ((resolve ,reject )=> {
16- if (! Boolean (promises[Symbol .iterator ])){
17- return reject (new TypeError (` ${ typeof promises} is not iterable(cannot read property Symbol(Symbol.iterator)` ))
18- }
19- let res = []
20- let completed = 0
21- if (promises .length === 0 ){
22- return resolve (res)// return ,后面不需要执行
15+ function myPromiseAll (promises ) {
16+ return new Promise ((resolve , reject ) => {
17+ // 1. 参数校验
18+ if (typeof promises? .[Symbol .iterator ] !== " function" ) {
19+ return reject (new TypeError (` ${ typeof promises} is not iterable` ));
2320 }
24- promises .forEach ((item ,index )=> {
25- Promise .reslove (item).then (value => {
26- res[index] = value
27- completed++
28- if (completed=== promises .length ){
29- resolve (res)
30- }
31- }).catch (err => {
32- reject (err)
33- })
34- })
35- })
36- }
37- ```
3821
22+ // 2. 转换为确定长度的数组
23+ const promiseArr = Array .from (promises);
24+ const total = promiseArr .length ;
25+ const res = [];
26+ let completed = 0 ;
3927
40- ``` js
41- function myPromiseAllSettled (promises ){
42- return new Promise ((resolve ,reject )=> {
43- if (! Boolean (promises[Symbol .iterator ])){
44- return reject (new TypeError (` ${ typeof promises} is not iterable(cannot read property Symbol(Symbol.iterator)` ))
45- }
46- let res = []
47- let completed = 0
48- if (promises .length === 0 ){
49- return resolve (res)
50- }
51- promises .forEach ((item ,index )=> {
52- promise .resolve (item).then (value => {
53- res[index]= {status: ' fulfilled' ,value}
54- }).catch (reson => {
55- res[index]= {status: ' rejected' ,reason}
56- }).finally (()=> {
57- completed++
58- if (completed=== promises .length ){
59- resolve (res)
28+ // 3. 处理空迭代器
29+ if (total === 0 ) return resolve (res);
30+
31+ // 4. 遍历处理
32+ for (let i = 0 ; i < total; i++ ) {
33+ const p = promiseArr[i];
34+ Promise .resolve (p)
35+ .then ((value ) => {
36+ res[i] = value;
37+ completed++ ;
38+ if (completed === total) {
39+ resolve (res);
6040 }
6141 })
62- })
63- })
42+ .catch ((err ) => {
43+ reject (err);
44+ });
45+ }
46+ });
6447}
6548` ` `
6649
6750` ` ` js
68- function myPromiseAll (promises ){
69- return new Promise ((resolve ,reject )=> {
70- if (! Boolean (promises[Symbol .iterator ])){
71- throw (new TypeError (` ${ typeof promises} is not iterator` ))
72- }
73- let res = []
74- let count = 0
75- let total = promises .length
76- if (total=== 0 ){
77- resove ([])
78- return
79- }
80- for (let i= 0 ;i< total;i++ ){
81- promise .resolve (promise).then ((val )=> {
82- res[i]= val
83- count++
84- if (count=== total){
85- resolve (res)
86- }
87- }).catch ((err )=> {
88- reject (err)
51+ function myPromiseAllSettle (promises ){
52+ return new Promise ((resolve ,reject )=> {
53+ if (typeof promises[Symbol .iterator ]!== ' function' ){
54+ return reject (new TypeError (` ${ typeof promises} is not iterable` ))
55+ }
56+ let res = []
57+ let complete = 0
58+ let pArr = Array .from (promises)
59+ let total = pArr .length
60+ if (total=== 0 ){
61+ return resolve (res)
62+ }
63+ pArr .forEach ((item ,i )=> {
64+ Promise .resolve (item).then ((value )=> {
65+ res[i] = {status: ' fulfilled' ,value}
66+ }).catch (reason => {
67+ res[i] = {status: ' rejected' ,reason}
68+ }).finally (()=> {
69+ complete++
70+ if (complete=== total){
71+ resolve (res)
72+ }
8973 })
90- }
91- })
74+ })
75+ })
9276}
9377` ` `
9478### 防抖和节流
79+
9580` ` ` js
9681function debounce (fn , delay ) {
9782 let timer;
@@ -103,16 +88,165 @@ function debounce(fn, delay) {
10388 };
10489}
10590
106- function throttle (fn ,delay ){
107- let lastTime = 0
108- return function (... args ){
109- const now = Date .now ()
110- if (now - lastTime >= delay){
111- fn .apply (this ,args)
112- lastTime = now
91+ function throttle (fn , delay ) {
92+ let lastTime = 0 ;
93+ return function (... args ) {
94+ const now = Date .now ();
95+ if (now - lastTime >= delay) {
96+ fn .apply (this , args);
97+ lastTime = now;
98+ }
99+ };
100+ }
101+ ` ` `
102+
103+ ### 深拷贝,数组打平
104+ 这类题都是一样的,要用递归
105+
106+ 但是跟力扣里二叉树相关的还不太一样,因为二叉树没有数组这个结构,所以在dfs里要判断一下传入节点的类型是数组还是对象
107+
108+ 一般是数组需要循环处理
109+ ` ` ` js
110+ // 输入: cityData、 'kklio2'
111+ // 输出: '广东省-东莞市-B区'
112+ const cityData = [
113+ {
114+ id: " axzx" ,
115+ name: " 广东省" ,
116+ children: [
117+ {
118+ id: " sdsd" ,
119+ name: " 深圳市" ,
120+ children: [
121+ {
122+ id: " 45dss" ,
123+ name: " 南山区" ,
124+ },
125+ {
126+ id: " sdsd11" ,
127+ name: " 福田区" ,
128+ children: [
129+ {
130+ id: " ddrr2" ,
131+ name: " A街道" ,
132+ },
133+ ],
134+ },
135+ ],
136+ },
137+ {
138+ id: " 2323d" ,
139+ name: " 东莞市" ,
140+ children: [
141+ {
142+ id: " xxs2" ,
143+ name: " A区" ,
144+ },
145+ {
146+ id: " kklio2" ,
147+ name: " B区" ,
148+ },
149+ ],
150+ },
151+ ],
152+ },
153+ ];
154+ function search (cityData , key ) {
155+ let path = [];
156+ let res = [];
157+ function dfs (node ) {
158+ if (! node) {
159+ return ;
160+ }
161+ if (Array .isArray (node)) {
162+ for (let i = 0 ; i < node .length ; i++ ) {
163+ dfs (node[i]);
164+ }
165+ } else {
166+ path .push (node .name );
167+ if (node .id === key) {
168+ res = [... path];
169+ return ;
170+ } else {
171+ dfs (node .children );
172+ }
173+ path .pop ();
113174 }
114175 }
176+ dfs (cityData);
177+ return res;
115178}
179+ console .log (search (cityData, " 45dss" ));
180+ ` ` `
181+ ### Proxy
182+ get要return值,set return false会报错
183+ // 实现 handler 函数以达到以下输出效果:
184+
185+ ` ` ` js
186+ const proxy = new Proxy ({}, handler);
187+ proxy .a = 10 ;
188+ console .log (proxy .a ); // 输出 10
189+ console .log (proxy .b ); // 输出 'default'
190+ proxy .a = ' string' ;
191+ console .log (proxy .a ); // 输出 10
192+ ` ` `
193+
194+ ` ` ` js
195+ const handler = {
196+ get (target , prop ) {
197+ if (prop=== ' a' ){
198+ return target[prop]
199+ }else {
200+ return ' default'
201+ }
202+ },
203+ set (target , prop , value ) {
204+ if (prop === " a" ) {
205+ if (typeof value === " number" ) {
206+ target[prop] = value;
207+ }
208+ } else {
209+ target[prop] = value;
210+ }
211+ return true ; // 必须返回 true 表示操作成功
212+ },
213+ };
116214` ` `
215+ ### js大数相加
216+ 转成字符串在reverse处理
117217
118- ### 深拷贝,数组打平
218+ ` ` ` js
219+ // js实现大数相加
220+ function sum (a , b ) {
221+ a += ' '
222+ b += ' '
223+ let arr1 = a
224+ .split (' ' )
225+ .reverse ()
226+ .map ((item ) => + item)
227+ let arr2 = b
228+ .split (' ' )
229+ .reverse ()
230+ .map ((item ) => + item)
231+ let add = 0
232+ let res = []
233+ let max = Math .max (arr1 .length , arr2 .length )
234+ for (let i = 0 ; i < max; i++ ) {
235+ let num1 = arr1[i] || 0
236+ let num2 = arr2[i] || 0
237+ res .push ((num1 + num2 + add) % 10 )
238+ if (num1 + num2 + add >= 10 ) {
239+ add = 1
240+ } else {
241+ add = 0
242+ }
243+ console .log (num1 + num2 + add)
244+ }
245+ if (add) {
246+ res .push (1 )
247+ }
248+ return res .reverse ().join (' ' )
249+ }
250+ ` ` `
251+ ### 构建html的ast
252+ 
0 commit comments