2013-12-06 8 views
1

Я работаю над многостраничным красящим приложением, есть кнопка «clear». Когда пользователь нажимает это, я хочу, чтобы все фигуры, нарисованные на этой странице, были очищены. Ниже приведен код кнопки очистки.Как удалить элементы из массива?

clear.addEventListener('click', function (e) { 
     canvas.width = canvas.width; 
     tempCanvas.width = tempCanvas.width; 
     var tempShapes = shapes.slice(); 
     alert(tempShapes.length); 
     for(var i=0; i<tempShapes.length; i++) 
     { 

      var A = tempShapes[i]; 
      if(A.pageNum == pNum) 
      { 
       alert('in'); 
       shapes.splice(i, 1); 
      } 
     } 
     //shapes.length = 0; 
     e.preventDefault(); 
    } 

shapes[] является массив, содержащий полные объекты всех страниц. Я просто хочу удалить их с текущим pagenumber (pNum). Когда код запускается, он оставляет один элемент в массиве формы для этой конкретной страницы, а иногда и из двух элементов. Я хочу, чтобы все элементы массива формы были удалены.

+0

В идеале? Используйте 'jQuery.filter' или' _.filter' или полисполнение Array.filter'. Вот почему эти библиотеки-утилиты настолько повсеместны в мире JavaScript ... – meagar

+0

@meagar 'Array.filter' является родным javascript, нет необходимости в библиотеках. – David

+1

Если вы не хотите использовать Array.filter, то итерация назад (для var i = tempShapes.length - 1; i> -1; i--) {}) позволит вам безопасно сращиваться. – imcg

ответ

3

Вы могли бы найти Array.filter более полезным для решения этой задачи, что-то вроде:

shapes = shapes.filter(function(shape, i) { 
    return tempShapes[i].pageNum != pnum; 
}) 
+0

+1 для функции фильтра. – undefined

+0

forms.splice (i--, 1) заставляет его застревать в бесконечном цикле. Не могли бы вы объяснить, как я могу использовать Array.filter в моем случае? –

+0

@AbdulJabbar, он практически дает вам код. Что вы не можете понять. – Alexander

2

Проблема в том, что ваши индексы массива не синхронизированы после удаления первого элемента:

orig : 0-0, 1-1, 2-2 
temp : 0-0, 1-1, 2-2 

remove orig[0] -> index 0 -> temp[0] = 0 

orig : 0-0, 1-1, 2-2 
temp : 0-1, 1-2 

remove orig[1] -> index 1 -> temp[1] = 2 !! 

You можно удалить из того же массива, что и вы ищите.

clear.addEventListener('click', function (e) { 
    for(var i=shapes.length-1; i>=0; i--) { 
     if(shapes[i].pageNum == pNum) { 
      shapes.splice(i, 1); 
     } 
    } 
    e.preventDefault(); 
} 

Или вы c a filter их:

clear.addEventListener('click', function (e) { 
    shapes = shapes.filter(function(item) { return item.pageNum != pNum }); 
    e.preventDefault(); 
} 
Смежные вопросы