1const str = '(((((1 & 2) | 3) & 4 & 5) | 6) & 7) | 8'
2
3const operate = ['&', '|']
4const divide = ['(', ')']
5
6
7function translate(str) {
8 let arr = str.replace(/ /gi, '').split('')
9 let arrTranslate = []
10 arr.forEach((itm, idx) => {
11 if (operate.indexOf(itm) > -1) {
12
13 arrTranslate.push({
14 index: idx,
15 type: 'operate',
16 value: itm,
17 })
18 } else if (divide.indexOf(itm) > -1) {
19
20 arrTranslate.push({
21 index: idx,
22 type: 'divide',
23 value: itm,
24 })
25 } else {
26
27 arrTranslate.push({
28 index: idx,
29 type: 'token',
30 value: itm,
31 })
32 }
33 })
34
35 return getResultByStack(arrTranslate)
36}
37
38function getResultByStack(arrTranslate) {
39
40 let obj = {
41 operate: '',
42 tokenList: [],
43 children: [],
44 }
45 let stack = []
46 arrTranslate.forEach((item) => {
47 if (item.value === '(') {
48 stack.push(item)
49 }
50 if (item.value === ')') {
51 stack.push(item)
52
53 if (checkStack(stack)) {
54
55 let child = getResultByStack(stack.slice(1, -1))
56 obj.children.push(child)
57
58 stack = []
59 }
60 }
61 if (item.type === 'operate') {
62 if (stack.length === 0) {
63
64 obj.operate = item.value
65 } else {
66
67 stack.push(item)
68 }
69 }
70
71 if (item.type === 'token') {
72 if (stack.length === 0) {
73
74 obj.tokenList.push(item)
75 } else {
76
77 stack.push(item)
78 }
79 }
80 })
81 return obj
82}
83
84
85function checkStack(stack) {
86 let leftCount = stack.filter((itm) => itm.value === '(').length
87 let rightCount = stack.filter((itm) => itm.value === ')').length
88 return leftCount === rightCount
89}
90
91console.log(JSON.stringify(translate(str)))
暂无评论,来抢沙发吧。