智现未来20250224一面
原创大约 2 分钟
- 算法 其实就是一个二叉树生成,印象中力扣或者牛客做过这道题,太久了还想了一会,一开始都没想起来怎么写,直接尬住
/*
使用 TypeScript 语法将没有层级的扁平数据转换成树形结构的数据
// 扁平数据
[
{ name: '文本1', parent: null, id: 1 },
{ name: '文本2', parent: 1, id: 2 },
{ name: '文本3', parent: 2, id: 3 },
{ name: '文本4', parent: null, id: 4 },
{ name: '文本5', parent: 4, id: 5 }
]
// 树状数据
[
{
name: '文本1',
id: 1,
children: [
{
name: '文本2',
id: 2,
children: [
{
name: '文本3',
id: 3,
children: [],
}
]
}
]
}, {
name: "文本4",
id: 4,
children: [
{
name: '文本5',
id: 5,
children: [],
}
]
}
]
*/
// 反正力扣或者牛客上都有
interface TreeNode {
name: string,
parent?: number | null,
id: number,
}
function convert2Tree(arr: TreeNode[]) {
const map: Map<number, TreeNode> = new Map()
const rootNode: TreeNode[] = [];
// 遍历
arr.forEach(item => {
const node = {
name: item.name,
id: item.id,
children: []
}
map.set(item.id, node)
if (item.parent === null) {
rootNode.push(node)
} else {
const parent = map.get(item.parent)
if (parent) {
parent.children.push(node)
}
}
})
return rootNode
}
- 作用域查找(完全答错) 一开始的直觉是没什么问题的,被问了两下有点不确定了,唉
function a(){
let test;
/* 作用域a */
return function b(){
let test;
/* 作用域链 b -> ? */
}
}
function c(){
let test;
/* 作用域c */
const fn = a();
fn();
}
c()
如上的代码,假设test都有可能不存在的话,查找test的顺序是什么样子的?
变量 test 的查找顺序:
当 b() 被调用时,它会按照以下顺序查找 test:
b() 自己的作用域:首先在 b() 内部查找 let test;。如果存在,则使用这个 test
a() 的作用域:如果 b() 内部没有 test,则会沿着作用域链向上查找 a() 的作用域,查找 a() 中的 let test;
全局作用域:如果 a() 中也没有 test,则会继续向上查找全局作用域
具体执行过程: c() 被调用,创建 c() 的作用域,其中包含 let test;
c() 调用 a(),a() 创建自己的作用域,其中包含 let test;
a() 返回 b(),c() 将 b() 赋值给 fn
c() 调用 fn(),即 b() D b() 开始执行,首先在自己的作用域内查找 test:
如果 b() 内部有 let test;,则使用这个 test
如果 b() 内部没有 test,则向上查找 a() 的作用域,查找 a() 中的 let test;
如果 a() 中也没有 test,则继续向上查找全局作用域
computed中,是怎么收集副作用函数的 首先明确是运行时收集,大致流程如下: 1.
spa应用中,是怎么做到路由变化而页面不刷新的 使用了windows.history.pushState()或者window.history.replaceState()修改地址,并不会触发页面更新. 使用哈希方法,不会导致页面更新
问项目,最多后天,把所有项目整理一下,搞得自己项目都记不清