我使用正则表达式来测试数组数组中的某些元素。如果内部数组不符合所需的格式,我想将其从主/外部数组中删除。我正在使用的正则表达式正常工作。我不确定为什么它没有删除 - 有人可以提出建议或提供任何修改来解决这个问题吗?
for (var i = arr.length-1; i>0; i--) {
var a = /^\w+$/;
var b = /^\w+$/;
var c = /^\w+$/;
var first = a.test(arr[i][0]);
var second = b.test(arr[i][1]);
var third = c.test(arr[i][2]);
if ((!first) || (!second) || (!third)){
arr.splice(i,1);
}
答案 0 :(得分:4)
在数组上转换splice
方法时,会立即更新其length
。因此,在将来的迭代中,您可能会跳过其中的一些成员。
例如:
var arr = ['a','b','c','d','e','f','g']
for(var i = 0; i < arr.length; i++) {
console.log(i, arr)
if(i%2 === 0) {
arr.splice(i, 1) // remove elements with even index
}
}
console.log(arr)
将输出:
0 ["a", "b", "c", "d", "e", "f", "g"]
1 ["b", "c", "d", "e", "f", "g"]
2 ["b", "c", "d", "e", "f", "g"]
3 ["b", "c", "e", "f", "g"]
4 ["b", "c", "e", "f", "g"]
["b", "c", "e", "f"]
我的建议是,如果你仍然必须遍历它,不要修改数组本身。使用另一个变量来保存它。
var arr = ['a','b','c','d','e','f','g']
var another = []
for(var i = 0; i < arr.length; i++) {
if(i%2) {
another.push(arr[i]) // store elements with odd index
}
}
console.log(another) // ["b", "d", "f"]
或者你可以使用Array.prototype.filter
,这更简单:
arr.filter(function(el, i) {
return i%2 // store elements with odd index
})
它还输出:
["b", "d", "f"]
答案 1 :(得分:1)
您的代码seems to work给我。您的帖子中的代码缺少}
以关闭for
语句,但这应该导致脚本无法解析甚至根本无法运行。
我同意Leo认为使用Array.prototype.filter
重写它可能会更清晰。
您问题中的代码看起来像过滤器:
arr = arr.filter(function (row) {
return /^\w+$/.test(row[0]) && /^\w+$/.test(row[1]) && /^\w+$/.test(row[2]);
});
我假设你的实际代码中有3个不同的正则表达式,如果它们在你的代码中完全相同,你可以通过定义一次RegExp文字来节省一点开销:
arr = arr.filter(function (row) {
var rxIsWord = /^\w+$/;
return rxIsWord.test(row[0]) && rxIsWord.test(row[1]) && rxIsWord.test(row[2]);
});