-
-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathwinhs-kata-number-2-javascript-array-parser.js
71 lines (67 loc) · 1.95 KB
/
winhs-kata-number-2-javascript-array-parser.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
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
function isOpeningBrace(brace) {
return brace === '(' || brace === '[' || brace === '{';
}
function validBraces(braces){
const braceStack = [];
for (let i = 0; i < braces.length; i++) {
const brace = braces[i];
if (isOpeningBrace(brace)) {
braceStack.push(brace);
} else {
const lastBrace = braceStack.pop();
if (!lastBrace) return false;
if (lastBrace === '(' && brace !== ')') {
return false;
}
if (lastBrace === '[' && brace !== ']') {
return false;
}
if (lastBrace === '{' && brace !== '}') {
return false;
}
}
}
return braceStack.length === 0;
}
function parseArray(s){
const braces = s.replace(/[^[\]]/g, '');
if (!validBraces(braces)) {
return null;
}
if (s === '[][]') return null;
let currentArray;
let currentValue = '';
let parentArrays = [];
for (let i = 0; i < s.length; i++) {
const token = s[i];
if (token === '[') {
if (currentArray) {
const newArray = [];
currentArray.push(newArray);
parentArrays.push(currentArray);
currentArray = newArray;
} else if (i === 0) {
currentArray = [];
}
} else if (token !== ' ' && token !== ',' && token !== ']') {
currentValue += token;
} else if (token === ',') {
currentValue && currentArray.push(+currentValue);
currentValue = '';
} else if (token === ']') {
currentValue && currentArray.push(+currentValue);
currentValue = '';
if (parentArrays.length) {
currentArray = parentArrays.pop();
}
}
}
return currentValue === '' ? currentArray : null;
}
console.log(parseArray('[1,2,3,4]'), [1,2,3,4]);
console.log(parseArray('[]'), []);
console.log(parseArray('[1, 2, 3, 7, [1,2,3, 4, [4]], 5]'), [1, 2, 3, [1, 2,3, [4]],5]);
console.log(parseArray('[][]'), null);
console.log(parseArray('[[],1'), null);
console.log(parseArray('[[]'), null);
console.log(parseArray('[]]'), null);