javascript - 为什么 reduce() 跳过方括号?
问题描述
我有这个代码:
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("()[]{}"));
如果出现以下情况,它需要返回 true:
- 开括号必须用相同类型的括号闭合。
- 开括号必须以正确的顺序闭合。
我的代码没有通过这个测试"()[]{}"
:它总是返回[,]
,我不明白为什么。我已经尝试使用正则表达式、 anscii 作为方括号,但它不起作用。
解决方案
因为 splice 改变了长度,您会通过查看日志注意到 [,] 因此在测试中被跳过(reduce
步骤中的当前索引不再对应于数组)。拼接时,您可能应该使用副本而不是原始数组,并测试此数组:
请注意,您的代码的制作方式不适用于嵌套括号/括号。您还应该小心使用indexOf
find cur
,因为它会返回第一个找到的,如果您更改代码,可能与您的真实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("()[]{}"));
推荐阅读
- ssl - 生成报告后,Odoo 停留在加载屏幕中
- ios - IOS:自我管理的电信
- python - 我将如何更改此代码以显示它是“向上”、“向下”还是“与前一个数字相同”?
- node.js - 将元数据访问到 noFlo 中的组件
- c - 可变参数函数的分配因指针类型不兼容而失败
- react-native - facebook广告sdk的问题
- r - ggplotly 反应图显示在 RStudio 的查看器面板上,但没有显示在闪亮的应用程序中
- javascript - jQuery droppable 不适用于某些 div
- r - rlang:将多个组与...传递给gather()
- .net-core - 使用 Azure AAD B2C 和 DotNetCore 进行 SAML 身份验证