s = ['[',']','{','}','(',')']
copied=s;
console.log(copied.length);
var output;
for(i=0;i<s.length;i++){
console.log("calling function",i);
different();
}
function different(){
if(copied[0]=='(' && copied[1]==')'){
copied.splice(0,2);
output= "valid";
console.log("checking",copied);
}
else if(copied[0]=='{' && copied[1]=='}'){
copied.splice(0, 2);
output= "valid";
}
else if(copied[0]=='[' && copied[1]==']'){
copied.splice(0, 2);
output= "valid";
console.log("checking",copied);
}
else {
output= "invalid";
}
}
console.log(copied);
console.log(copied.length);
console.log("result is ",output);
i am getting the following output
6
calling function 0
checking [ ‘{‘, ‘}’, ‘(‘, ‘)’ ]
calling function 1
[ ‘(‘, ‘)’ ]
2
result is valid
The problem is for loop runs only twice but it is supposed to run 6 times.
>Solution :
Fixed a few issues with the code. The primary one being that the OP’s different() function examines the same part of the array, no matter the state of the loop…
const s = ['[', ']', '{', '}', '(', ')', '[', '***']
for (i = 0; i < s.length - 1; i += 2) {
let result = different(s[i], s[i + 1]);
console.log(result)
}
function different(a, b) {
let match =
(a === '(' && b === ')') ||
(a === '[' && b === ']') ||
(a === '{' && b === '}')
return `"${a}" and "${b}" ${match ? '' : 'do not'} match`
}
A more scalable approach would put represent the syntax in data, like this…
const s = ['[', ']', '{', '}', '(', ')', '[', '***']
const delimiters = {
'[': ']',
'(': ')',
'{': '}',
}
for (i = 0; i < s.length - 1; i += 2) {
let result = different(s[i], s[i + 1]);
console.log(result)
}
function different(a, b) {
let match = delimiters[a] === b;
return `"${a}" and "${b}" ${match ? '' : 'do not'} match`
}