使用正则表达式从数组数组中删除元素

时间:2015-04-28 01:14:01

标签: javascript arrays regex node.js

我使用正则表达式来测试数组数组中的某些元素。如果内部数组不符合所需的格式,我想将其从主/外部数组中删除。我正在使用的正则表达式正常工作。我不确定为什么它没有删除 - 有人可以提出建议或提供任何修改来解决这个问题吗?

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);
}

2 个答案:

答案 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]);
});

jsFiddle

我假设你的实际代码中有3个不同的正则表达式,如果它们在你的代码中完全相同,你可以通过定义一次RegExp文字来节省一点开销:

arr = arr.filter(function (row) {
  var rxIsWord = /^\w+$/;
  return rxIsWord.test(row[0]) && rxIsWord.test(row[1]) && rxIsWord.test(row[2]);
});