2013-02-16 68 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]从对象中删除属性。