Skip to content

Commit fa048ba

Browse files
committed
perf: improve perf
1 parent 6e60b91 commit fa048ba

File tree

3 files changed

+72
-80
lines changed

3 files changed

+72
-80
lines changed

rollup.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export default [
9797
tsconfig: 'tsconfig.json',
9898
include: ['src/**/*.ts'],
9999
declaration: true,
100-
declarationMap: true,
100+
declarationMap: false,
101101
outDir: 'dist/types',
102102
emitDeclarationOnly: true
103103
}),

src/tree.ts

Lines changed: 71 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ export interface IFilterCondition<V> {
3232
* @param {options} options 支持定制子元素名称、反向遍历、广度优先遍历,默认{
3333
childField: 'children',
3434
reverse: false,
35-
breadthFirst: false
35+
breadthFirst: false,
36+
isDomNode: false,
3637
}
3738
* @returns {*}
3839
*/
@@ -45,7 +46,7 @@ export function forEachDeep<V>(
4546
tree: ArrayLike<V>,
4647
parent: V | null,
4748
level: number
48-
) => boolean | void,
49+
) => boolean | undefined,
4950
options: { childField?: string; reverse?: boolean; breadthFirst?: boolean; isDomNode?: boolean } = {
5051
childField: 'children',
5152
reverse: false,
@@ -68,92 +69,88 @@ export function forEachDeep<V>(
6869
parent: V | null;
6970
level: number;
7071
}[] = [];
71-
const walk = (arr: ArrayLike<V>, parent: V | null, level = 0) => {
72-
if (reverse) {
73-
for (let index = arr.length - 1; index >= 0; index--) {
74-
if (isBreak) {
72+
const reverseWalk = (arr: ArrayLike<V>, parent: V | null, level = 0) => {
73+
for (let index = arr.length - 1; index >= 0; index--) {
74+
if (isBreak) {
75+
break;
76+
}
77+
const item = arr[index];
78+
// 广度优先
79+
if (breadthFirst) {
80+
queue.push({ item, index, array: arr, tree, parent, level });
81+
} else {
82+
const re = iterator(item, index, arr, tree, parent, level);
83+
if (re === false) {
84+
isBreak = true;
7585
break;
86+
} else if (re === true) {
87+
continue;
7688
}
77-
const item = arr[index];
78-
// 广度优先
79-
if (breadthFirst) {
80-
queue.push({ item, index, array: arr, tree, parent, level });
81-
} else {
82-
const re = iterator(item, index, arr, tree, parent, level);
83-
if (re === false) {
84-
isBreak = true;
85-
break;
86-
} else if (re === true) {
87-
continue;
88-
}
89-
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
90-
walk(item[childField], item, level + 1);
91-
}
89+
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
90+
reverseWalk(item[childField], item, level + 1);
9291
}
9392
}
94-
if (breadthFirst) {
95-
// Process queue
96-
while (queue.length > 0 && !isBreak) {
97-
const current = queue.shift();
98-
const { item, index, array, tree, parent, level } = current!;
99-
const re = iterator(item, index, array, tree, parent, level);
100-
if (re === false) {
101-
isBreak = true;
102-
break;
103-
} else if (re === true) {
104-
continue;
105-
}
106-
107-
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
108-
walk(item[childField], item, level + 1);
109-
}
93+
}
94+
if (breadthFirst) {
95+
// Process queue
96+
while (queue.length > 0 && !isBreak) {
97+
const current = queue.shift();
98+
const { item, index, array, tree, parent, level } = current!;
99+
const re = iterator(item, index, array, tree, parent, level);
100+
if (re === false) {
101+
isBreak = true;
102+
break;
103+
} else if (re === true) {
104+
continue;
105+
}
106+
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
107+
reverseWalk(item[childField], item, level + 1);
110108
}
111109
}
112-
} else {
113-
for (let index = 0, len = arr.length; index < len; index++) {
114-
if (isBreak) {
110+
}
111+
};
112+
const walk = (arr: ArrayLike<V>, parent: V | null, level = 0) => {
113+
for (let index = 0, len = arr.length; index < len; index++) {
114+
if (isBreak) {
115+
break;
116+
}
117+
const item = arr[index];
118+
if (breadthFirst) {
119+
// 广度优先
120+
queue.push({ item, index: index, array: arr, tree, parent, level });
121+
} else {
122+
// 深度优先
123+
const re = iterator(item, index, arr, tree, parent, level);
124+
if (re === false) {
125+
isBreak = true;
115126
break;
127+
} else if (re === true) {
128+
continue;
116129
}
117-
const item = arr[index];
118-
if (breadthFirst) {
119-
// 广度优先
120-
queue.push({ item, index: index, array: arr, tree, parent, level });
121-
} else {
122-
// 深度优先
123-
const re = iterator(item, index, arr, tree, parent, level);
124-
if (re === false) {
125-
isBreak = true;
126-
break;
127-
} else if (re === true) {
128-
continue;
129-
}
130-
131-
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
132-
walk(item[childField], item, level + 1);
133-
}
130+
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
131+
walk(item[childField], item, level + 1);
134132
}
135133
}
136-
if (breadthFirst) {
137-
while (queue.length > 0 && !isBreak) {
138-
const current = queue.shift();
139-
if (!current) break;
140-
const { item, index, array, tree, parent, level } = current;
141-
const re = iterator(item, index, array, tree, parent, level);
142-
if (re === false) {
143-
isBreak = true;
144-
break;
145-
} else if (re === true) {
146-
continue;
147-
}
148-
149-
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
150-
walk(item[childField], item, level + 1);
151-
}
134+
}
135+
if (breadthFirst) {
136+
while (queue.length > 0 && !isBreak) {
137+
const current = queue.shift();
138+
if (!current) break;
139+
const { item, index, array, tree, parent, level } = current;
140+
const re = iterator(item, index, array, tree, parent, level);
141+
if (re === false) {
142+
isBreak = true;
143+
break;
144+
} else if (re === true) {
145+
continue;
146+
}
147+
if (item && (isDomNode ? isNodeList(item[childField]) : Array.isArray(item[childField]))) {
148+
walk(item[childField], item, level + 1);
152149
}
153150
}
154151
}
155152
};
156-
walk(tree, null, 0);
153+
reverse ? reverseWalk(tree, null, 0) : walk(tree, null, 0);
157154
// @ts-ignore
158155
tree = null;
159156
}

src/type.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,8 @@ export function objectHas<T extends AnyObject>(obj: T, key: keyof T): boolean {
7070
*/
7171
export function arrayLike(any: unknown): boolean {
7272
if (isArray(any)) return true;
73-
7473
if (isString(any)) return true;
75-
7674
if (!isObject(any)) return false;
77-
7875
return objectHas(any, 'length');
7976
}
8077

@@ -190,14 +187,12 @@ export function isEmpty(value: any): boolean {
190187
return true;
191188
}
192189
const tag = typeIs(value);
193-
194190
if (arrayLike(value) || 'Arguments' === tag) {
195191
return !value.length;
196192
}
197193
if ('Set' === tag || 'Map' === tag) {
198194
return !value.size;
199195
}
200-
201196
return !Object.keys(value).length;
202197
}
203198

0 commit comments

Comments
 (0)