为什么 reduce() 跳过方括号?
Why reduce() skip square brackets?
我有这个代码:
var isValid = function(s) {
let arr = [...s];
arr.reduce((acc, cur) => {
console.log(`arr in reduce: ${arr}`);
console.log(`acc: ${acc}`);
console.log(`cur: ${cur}`);
if ((acc && cur)
&& (
(acc === '(' && cur === ')')
|| (acc === '{' && cur === '}')
|| (acc === '[' && cur === ']')
)) {
arr.splice(arr.indexOf(acc), 2);
console.log(`arr after splice: ${arr}`);
return arr;
}
else {
console.log(`else statement: ${cur}`);
return cur;
}
});
return arr.length === 0 ? true : false;
};
console.log(isValid("()[]{}"));
它需要 return true 如果:
- 左括号必须由相同类型的括号闭合。
- 左括号必须以正确的顺序闭合。
我的代码没有通过这个测试 "()[]{}"
:它总是 returns [,]
我不明白为什么。我试过使用正则表达式,方括号使用 anscii,但它不起作用。
因为 splice 改变了长度,您会通过查看日志注意到 [] 因此在测试中被跳过(reduce
步骤中的当前索引与数组)。拼接时,您可能应该使用副本而不是原始数组,并改为测试此数组:
请注意,您编写代码的方式不适用于嵌套 parenthesis/brackets。你还应该小心使用indexOf
来查找cur
,因为它会return第一个找到,如果你改变你的代码,它可能与你真正的cur
.
var isValid = function(s) {
let arr = [...s], copy = [...s];
arr.reduce((acc, cur) => {
console.log(`arr in reduce: ${arr}`);
console.log(`copy in reduce: ${copy}`);
console.log(`acc: ${acc}`);
console.log(`cur: ${cur}`);
if ((acc && cur)
&& (
(acc === '(' && cur === ')')
|| (acc === '{' && cur === '}')
|| (acc === '[' && cur === ']')
)) {
copy.splice(copy.indexOf(acc), 2);
console.log(`copy after splice: ${copy}`);
return arr;
}
else {
console.log(`else statement: ${cur}`);
return cur;
}
});
return copy.length === 0 ? true : false;
};
console.log(isValid("()[]{}"));
您可以为预期的结束字符获取一个对象,如果找到一个开放字符,则将预期的结束字符推入堆栈。
否则根据字符检查弹出的值。
var isValid = function([...array]) {
var stack = [],
open = { '(': ')', '[': ']', '{': '}' };
return array.every(c => c in open ? stack.push(open[c]) : c === stack.pop())
&& !stack.length;
};
console.log(isValid("()[]{}"));
console.log(isValid("(({}[()]))[]{}"));
console.log(isValid("()[]{}}"));
console.log(isValid("["));
我有这个代码:
var isValid = function(s) {
let arr = [...s];
arr.reduce((acc, cur) => {
console.log(`arr in reduce: ${arr}`);
console.log(`acc: ${acc}`);
console.log(`cur: ${cur}`);
if ((acc && cur)
&& (
(acc === '(' && cur === ')')
|| (acc === '{' && cur === '}')
|| (acc === '[' && cur === ']')
)) {
arr.splice(arr.indexOf(acc), 2);
console.log(`arr after splice: ${arr}`);
return arr;
}
else {
console.log(`else statement: ${cur}`);
return cur;
}
});
return arr.length === 0 ? true : false;
};
console.log(isValid("()[]{}"));
它需要 return true 如果:
- 左括号必须由相同类型的括号闭合。
- 左括号必须以正确的顺序闭合。
我的代码没有通过这个测试 "()[]{}"
:它总是 returns [,]
我不明白为什么。我试过使用正则表达式,方括号使用 anscii,但它不起作用。
因为 splice 改变了长度,您会通过查看日志注意到 [] 因此在测试中被跳过(reduce
步骤中的当前索引与数组)。拼接时,您可能应该使用副本而不是原始数组,并改为测试此数组:
请注意,您编写代码的方式不适用于嵌套 parenthesis/brackets。你还应该小心使用indexOf
来查找cur
,因为它会return第一个找到,如果你改变你的代码,它可能与你真正的cur
.
var isValid = function(s) {
let arr = [...s], copy = [...s];
arr.reduce((acc, cur) => {
console.log(`arr in reduce: ${arr}`);
console.log(`copy in reduce: ${copy}`);
console.log(`acc: ${acc}`);
console.log(`cur: ${cur}`);
if ((acc && cur)
&& (
(acc === '(' && cur === ')')
|| (acc === '{' && cur === '}')
|| (acc === '[' && cur === ']')
)) {
copy.splice(copy.indexOf(acc), 2);
console.log(`copy after splice: ${copy}`);
return arr;
}
else {
console.log(`else statement: ${cur}`);
return cur;
}
});
return copy.length === 0 ? true : false;
};
console.log(isValid("()[]{}"));
您可以为预期的结束字符获取一个对象,如果找到一个开放字符,则将预期的结束字符推入堆栈。
否则根据字符检查弹出的值。
var isValid = function([...array]) {
var stack = [],
open = { '(': ')', '[': ']', '{': '}' };
return array.every(c => c in open ? stack.push(open[c]) : c === stack.pop())
&& !stack.length;
};
console.log(isValid("()[]{}"));
console.log(isValid("(({}[()]))[]{}"));
console.log(isValid("()[]{}}"));
console.log(isValid("["));