js练习两则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* 
请使用JavaScript实现一个getIntersection函数,可获取多个区间的交集,规则如下:
区间用长度为2的数字数组表示,如[2, 5]表示区间2到5(包括2和5);区间不限定方向,如[5, 2]等同于[2, 5];
该方法可接受多个区间,并返回所有区间的交集(用区间表示),如空集用null表示。并能正确通过以下测试用例
*/
function getIntersection(...args) {
// your code here
const minArr = [];
const maxArr = [];
// 验证输入
const length = args.length;
for(let i = 0; i < length; i++) {
if(typeof args[i][0] !== 'number' || typeof args[i][1] !== 'number') return null;
}
// 取左边和右边
args.forEach(v => {
minArr.push(Math.min(...v));
maxArr.push(Math.max(...v));
});
const left = Math.max(...minArr);
const right = Math.min(...maxArr);
if(left <= right) return [left, right];
return null;
}

getIntersection([1, 4], [3, 5]); // [3, 4]
getIntersection([5, 2], [4, 9], [3, 6]); // [4, 5]
getIntersection([1, 7], [8, 9]); // null
getIntersection(['x', 7], [4, 9]); // null
getIntersection([1, 2]); // [1, 2]
getIntersection([1, 2], [2, 3]); // [2, 2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
请使用 JavaScript 编写一个树的深度优先遍历函数(节点最深的最先访问到,依次类推),满足以下测试用例:
假设树的结构如下
*/
const tree = [
{
id: 1,
name: '张三',
children: [
{
id: 2,
name: '李四',
children: [
{
id: 5,
name: '张五'
}
]
}
]
},
{
id: 6,
name: '玛丽'
}
]

// 测试用例:

// 1. 生成一颗新树,将所有节点的id,加1
console.log(treeMap(tree, node => {
let newNode = { ...node }
newNode.id = node.id + 1
return newNode
}))
// 打印的新树,应该与tree的结构一致,只是每个id自增1,老的tree,应该没有任何改动

// 2. 打印每个节点的id
treeMap(tree, node => {
console.log(node.id)
return node
});
// 应打印顺序应该是: 5,2,1,6

// 3. 对于非法输入,应直接返回第一个入参
console.log(treeMap(null)) // 输出null
console.log(treeMap(tree, true/*不是函数*/)) //输出tree


// 解答:
const deepClone = tree => {
let newTree = [];
tree.forEach(node => {
let newnode = {}
newnode.id = node.id;
newnode.name = node.name;
if(node.children) {
newnode.children = deepClone(node.children);
}
newTree.push(newnode);
})
return newTree;
}

const treeMap = (root, fn) => {
// 验证是否为数组
if(!Array.isArray(root)) {
return root;
}
// 验证是否是函数
if({}.toString.call(fn) !== '[object Function]') {
// 不是函数
fn = f => f;
}

const deepCloneTree = deepClone(root);
deepCloneTree.forEach((child, index, array) => {
if(child.children) {
dfs(child, fn);
}
array[index] = fn(child);
})
return deepCloneTree;
}

const dfs = (root, fn) => {
if(root.children){
root.children.forEach((child, index, array) => {
dfs(child, fn);
array[index] = fn(child);
})
}
}