2017-01-23 2 views
0

Мне нужна помощь. Мне нужно удалить строку из массива в соответствии с некоторым условием с помощью JavaScript. Я объясняю свой код ниже:Не удалось удалить строку из массива с помощью Javascript/JQuery

var arr = [{ 
     'value': '', 
     'name': 'Rajeev' 
     }, { 
     'value': '1', 
     'name': 'Raj' 
     }, { 
     'value': '', 
     'name': 'Ram' 
     }]; 


for(var i=0;i<arr.length;i++){ 
    if(arr[i]['value']==''){ 
     arr.splice(i,1); 
    } 
} 

Здесь после того, как любое значение удаляет индекс массива меняется, поэтому он не может быть надлежащим образом удален при любых условиях. Мне нужно удалить строку, value ==''. Пожалуйста, помогите мне.

+2

Кажется, работает отлично. –

ответ

0

Он пропустит элементы, поскольку элемент удаления изменит индекс, но вы не обновляете значение i. Делайте это в обратном порядке, чтобы избежать таких проблем, то есть прекратить работу.

var i = arr.length; 

while(i--){ 
    if(arr[i]['value']==''){ 
     arr.splice(i,1); 
    } 
} 
+1

@Satpal: thanks mate :) –

1

Вы можете перебирать с конца, потому что Array#splice уменьшает длину массива.

В вашем коде, и если вы сплайсируете, вы должны держать индекс в том же индексе, не увеличивая его.

for (var i = arr.length - 1; i >= 0; i--){ 
    if (arr[i]['value'] == '') { 
     arr.splice(i, 1); 
    } 
} 
0

Как насчет создания нового массива, добавляя элементы, которые не являются '' и заменяют старые на новые? Замените ваш цикл кодом ниже и посмотрите, работает ли он.

var newArr = []; 

for (var i = 0; i < arr.length; i++) { 
    if (arr[i]['value'] !== '') { 
     newArr.push(arr[i]); 
    } 
} 
arr = newArr; 

Fiddle: https://jsfiddle.net/sno3pphs/

0

Привычка работы, потому что Lenth вашего массива динамически изменяется при удалении элемента. Вы должны уменьшить переменную i. Попробуйте:

var arr = [{ 
     'value': '', 
     'name': 'Rajeev' 
     }, { 
     'value': '1', 
     'name': 'Raj' 
     }, { 
     'value': '', 
     'name': 'Ram' 
     }]; 


for(var i=0;i<arr.length;i++){ 
    if(arr[i]['value']==''){ 
     arr.splice(i,1); 
     i--; 
    } 
} 
1
arr = arr.filter(element => element.value != '') 
+1

Лучше всего, если вы установите 'arr' как' arr = arr.filter (element => element.value! = '') ' – Doruk

+0

Спасибо, что указали массив @Doruk .filter создает новый объект массива, заполненный элементами, которые удовлетворяют заданному предикату. Я отредактировал свой ответ соответственно, так как плакат хочет окончательно избавиться от этих элементов. – Dagohan

0

Вы меняете размер массива, но продолжают расти индекс, если вы хотите изменить размер массива во время работы цикла а, предлагаю вам использовать

for each (var item in arr) { 
if(item.val==''){ 
     arr.splice(item ,1); 
     i--; 
    } 

вас может это сделать более эффективным способом, как this

array = arr.filter(function(currentChar) { 
    return currentChar !== " "; 
}); 
0

с помощью lodash вы можете отфильтровать его легко

первый параметр будет ваш массив, а функция возвращает значение без «»

var fArray = _.remove(arr, function(obj) { 
return (obj.value != ''); }); 

fArray будет ваш желаемый массив значение не «»

Смежные вопросы