2013-02-16 67 views
0

我希望模擬任務欄(運行任務/應用程序)。我打算存儲的任務是這樣的:用Javascript編輯鋸齒陣列

(function() 
{ 
    var tasks = []; 

    addTask = function (taskName, taskWindow) 
    { 
     if (!tasks[taskName]) { tasks[taskName] = []; } 
     tasks[taskName].push({ taskWindow: taskWindow, taskName: taskName}); 
    }; 
    removeTask = function (taskName, taskWindow) 
    { 
     if (tasks[taskName]) 
     { 
      //Somehow remove the object from the array 
     }   
    }; 
}()); 

我應該怎麼寫removeTask()從這個鋸齒數組中刪除正確的元素?

+0

只是做一個for循環任務[taskName],找到一個通過taskID,使用array.splice,並關閉這個問題 – 2013-02-16 05:41:50

+0

你可能想考慮backbone.js或MVC的其他框架。你會發現這樣的事情非常有幫助。 – VNO 2013-02-16 05:42:12

回答

1

我建議使用對象來存儲你的任務,因爲它會使你的(具體到您的要求,我不是在談論陣VS對象),代碼更乾淨,更易於維護

var taskManager = (function(){ 
    function taskManager(tasks){ 
     // Do your tasks validation before passing to this. 
     var this.tasks = tasks || {}; // tasks value is not private here   
    } 
    // Assuming taskID would be unique value 
    taskManager.prototype.addTask = function (taskName, taskID){ 
     if (!this.tasks[taskID]) { 
      this.tasks[taskID] = { taskID: taskID, taskName: taskName }; 
     } 
    }; 
    taskManager.prototype.removeTask = function (taskName, taskID){ 
     if (this.tasks[taskID]){ 
     delete this.tasks[taskID]; 
     }   
    }; 
    return taskManager; 
})(); 

用法:

var taskManager1 = new taskManager(); 
taskManager1.addTask(a,b); 
taskManager1.removeTask(a); 
+0

問題是我不再有按名稱分組的任務。此外,我在我的原始代碼中顯示taskID爲我將要存儲的其他信息中的一個錯誤。實際上,它將是對任務對話框窗口的引用,而不是整數。 – CHS 2013-02-16 06:12:46

+0

但我認爲你是對的。 'tasks'應該是一個具有數組屬性的對象。 – CHS 2013-02-16 06:27:53

+0

您將它包裹在自執行功能中的要點是什麼?我沒有看到它提供的任何特別的好處。 – jfriend00 2013-02-16 06:31:36

1

數組意味着有數字索引,您可以使用.splice()從數組中刪除數字索引項。非數字索引並不在數組中,它們最終只是數組對象的屬性,可以使用delete運算符將其刪除。

如果您沒有數字索引,那麼您應該使用一個對象並使用屬性爲每個項目建立索引。這樣做時,可以使用delete tasks[taskName]從對象中刪除屬性。