2015-04-28 2 views
2

Я использую регулярное выражение для проверки определенных элементов в массиве массивов. Если внутренний массив не соответствует желаемому формату, я хотел бы удалить его из основного/внешнего массива. Регулярное выражение, которое я использую, работает правильно. Я не уверен, почему он не удаляется. Может ли кто-нибудь советовать или предлагать какие-либо изменения для решения этой проблемы?Удаление элемента из массива массивов с помощью регулярного выражения

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

Вы можете создать jsfiddle с некоторыми тестовыми значениями? –

+0

Вы пробовали регулярное выражение, не пытаясь сопоставить начало и конец строки, т. Е.^И $? – avguchenko

ответ

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"] 
+0

@ djfkdjfkd39939 Нет, с 'i Leo

+0

@ djfkdjfkd39939 обновил мой пример, чтобы вы могли видеть, что происходит с массивом при его изменении в итерациях. – Leo

+0

@ djfkdjfkd39939 Он должен работать. Основная причина, с которой вы столкнулись, не имеет ничего общего с вложением массива. – Leo

1

Ваш код seems to work мне. В коде вашего сообщения отсутствовал }, чтобы закрыть оператор for, но это должно было привести к тому, что скрипт не смог разобрать и даже не запустить вообще.

Я согласен с Лео, что, вероятно, было бы проще переписать его, используя 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]); 
}); 
Смежные вопросы