在Javascript中创建和引用对象数组

时间:2015-08-18 01:51:52

标签: javascript arrays object indexing key-value

我正在尝试创建一个包含任务和子任务的通用待办事项列表。任何给定的待办事项列表将具有一个或多个任务,并且每个任务将具有一个或多个子任务。对于每个子任务,我显示的是显示任务和子任务的卡,以及有关用户的其他一些相关信息。因此,为任何给定列表呈现的卡的数量等于子任务的数量,并且可以按任务分类。

对我来说棘手的部分是我需要能够引用这些卡(因为我将进行API调用以获取任务和子任务数据 - 这两个数据都是数组,顺便提一下 - 来自不同类型的列表),我不确定引用有效具有2个索引(任务和子任务)的最佳方法。

我的想法一直专注于创建任务的toDoList数组:子任务对象[{task 1, subtask 1}, {task 1, subtask 2}, {task 2, subtask 1), etc}] - 但是当我开始这样做时,我会陷入两个地方:

  1. 以编程方式创建键值对(我使用嵌套循环来迭代任务和子任务)

  2. 以后如何引用它们,因为我需要关联这些任务:例如,具有特定DOM对象的子任务对执行隐藏它们等功能。

  3. 我有一些代码,但感觉真的很不合适,所以甚至不包括在这里。基本上,我觉得有一个简单的解决方案,不到十几行代码,一个比我更好的程序员会立刻看到,我很感激帮助。非常感谢!

2 个答案:

答案 0 :(得分:1)

不确定您对编写数据结构有多少控制权,但也许这样的事情可行。

这里的想法是,您为所有子任务提供ID,然后通过一系列子任务ID跟踪任务的子任务。

var tasks = [
  {name: 'clean apartment', subtasks: [1, 2, 3]},
  {name: 'do the dishes', subtasks: [6]},
  {name: 'eat lunch', subtasks: [4, 5]}
];

var subtasks = [
  {name: 'vaccuum', id: 1},
  {name: 'dust', id: 2},
  {name: 'wipe down', id: 3},
  {name: 'make sandwich', id: 4},
  {name: 'drink a beer', id: 5},
  {name: 'soak pans', id: 6}, 
];


var i, j, l = tasks.length;
for(i; i < l; i++) {
  var task = tasks[i],
      ll = task.subtasks.length;
  for(j=0; j < ll; j++) {
    // Now you know the parent task and all its subtasks
  }
}

此外,如果您不介意使用像underscore这样的库的帮助,您可以采用相反的方式。这样,您可以为所有任务提供ID,然后为子任务提供task字段,该字段将它们映射到任务。使用underscore's findWhere,您可以在迭代每个子任务时轻松查找任务。

var tasks = [
  {name: 'clean apartment', id: 1},
  {name: 'do the dishes', id: 2},
  {name: 'eat lunch', id: 3}
];

var subtasks = [
  {name: 'vaccuum', task: 1},
  {name: 'dust', task: 1},
  {name: 'wipe down', task: 1},
  {name: 'make sandwich', task: 3},
  {name: 'drink a beer', task: 2},
  {name: 'soak pans', task: 2}, 
];

for(var i = 0; i < subtasks.length; i++) {
  var subtask = subtasks[i],
      task = _.findWhere(tasks, {id: subtask.task})
  // Now you know the subtask and its task
}

根据我发布的评论,我还创建了一个小提琴来举例说明创建子任务卡:http://jsfiddle.net/grammar/ynw0eb25/

答案 1 :(得分:0)

这样的结构能否胜任这项工作?

&#13;
&#13;
[    
    {taskId: '1', 

     subtasks:[{subtaskId:'1', otherAttributes:'...'}, 
               {subtaskId:'2', otherAttributes:'...'},
                ...
              ]
     },
    {taskId: '2', 
     subtasks:[{subtaskId:'1', otherAttributes:'...'}, 
               ...
              ]
    }
    ....
]
&#13;
&#13;
&#13;