2015-04-23 50 views
-1

我試圖在單擊元素時拼接數組。當我console.log新數組它不規則,有時刪除錯誤的數組元素和最後一個索引將永遠不會被刪除。這裏有一個很好的解釋嗎?Javascript中的拼接數組是不規則的

var container = document.getElementById('container'), 
notDone = document.getElementsByClassName('notDone'), 
deleting = document.getElementsByClassName('delete'), 
div, 
remove, 
i, 
toDo = [ 
'One', 
'Two', 
'öäå'], 


for(i = 0; i < toDo.length; i++){ 
    div = document.createElement('div'); 
    div.innerHTML = toDo[i]; 
    div.className = 'notDone'; 
    remove = document.createElement('div'); 
    remove.innerHTML = '<p>Remove</p>'; 
    remove.setAttribute("data-id", i); 
    remove.className = 'delete'; 

    container.appendChild(div); 
    div.appendChild(remove); 

    notDone[i].addEventListener('click', function(){ 

     if(this.classList.contains('notDone')){ 
      this.className = 'done'; 
     }else{ 
      this.className = 'notDone'; 
     } 
    }); 

    deleting[i].addEventListener('click', function(event){ 
     event.stopPropagation(); 
     var shouldDelete = this.getAttribute("data-id"); 
     console.log('va' + shouldDelete); 
     toDo.splice(shouldDelete, 1); 
     this.parentNode.remove(); 
     console.log(toDo); 
    }); 
} 
var check = document.getElementById('check'); 
check.addEventListener('click', function(){ 
    console.log(toDo + ' checking array') 
}); 
+0

現在的問題是,爲什麼會'這一點。 getAttribute(「data-id」)'返回一個數組,而不是一個字符串? – adeneo

+0

@ adeneo:'toDo'是數組,'shouldDelete'是一個整數字符串。 – Bergi

+0

這是一個很好的問題,我不能回答,我是JS新手,仍然在學習。有關我應該如何解決這個問題的任何想法? – NinjaGrisen

回答

0

它有時消除了錯誤的數組元素

您所面臨的問題是,data-id正存儲一個固定索引,然而toDo陣列是可變的。當你從數組中刪除一個元素時,它後面的所有索引變得無效。例如,當你.splice(0, 1),那麼你不能再做splice(2, 1),因爲該數組只剩下兩個項目。

最後一個索引將永遠不會被刪除。

它會,如果你最先點擊最後一個元素。


你可以做的,而不是要麼

  • 沒有從toDo陣列去除指數(和切割整個陣列),只是設置數組值null;或
  • 沒有存儲原始指標,但要刪除的值,當前的數組中每一次搜索他們(使用indexOf)你刪除一個元素