2014-10-16 41 views
1

以下是数据。我想要做的是注入所有这些数据转化为包含所有属于这些类别的类别和所有的书一个变量:卡住实现一个嵌套的数据过滤循环,可能是一个更优雅的方式吗?

var categories = [ 

    // ... 

    { 
     "_id" : "5436b12b456f61180f815c06", 
     "name" : "Horror" 
    }, 

    { 
     "_id" : "5436b43f18bbc8a8073e786e", 
     "name" : "Action" 
    } 

    // ... 

]; 

var books = [ 

    // ... 

    { 
     "_id" : "5436b43f18bbc8a8073e786d", 
     "title" : "The Bourne Legacy", 
     "category" : "5436b43f18bbc8a8073e786e" 
    }, 

    { 
     "_id" : "5436b5c9de9884e010d5ef24", 
     "title" : "Digital Fortress", 
     "category" : "5436b50dc6faf3d41071a669" 
    } 

    // ... 

]; 

这是我想如何将数据看起来像一个样机过滤后:

categories_titles = [ 
    { 
     categoryName: 'Category One', 
     categoryTitles: [ 
      {title: 'Book 1'}, 
      {title: 'Book 2'}, 
      // ... 
     ] 
    }, 

    { 
     categoryName: 'Category Two', 
     categoryTitles: [ 
      {title: 'Book 3'}, 
      {title: 'Book 4'}, 
      // ... 
     ] 
    } 
]; 

这是我正在努力解决的问题:

categories_titles= []; 

for (var category in categories) { 
    for (var book in books) { 
     if (books[book].category == categories[category]._id) { 
      categories_titles.push(
       { 
        name: categories[category].name, 
        titles: [ 
         {title: books[book].title} 
        ] 
       } 
      ); 
     } 
    } 
} 

这种方法仅适用部分;所有类别正在列出,但有些正在重复,并且有些标题不见了,或者不在其应有的位置。

此外,访问项目,如:categories_titles[0].titles[0].title是相当怪物,我有一种感觉,这可以更优雅地解决。

请指教。

回答

1

确实有更好的方法来做到这一点。我将重新排列你的数据结构。从我的数据结构到你的过滤器是一个线性时间算法,但我不明白为什么你想要。但是,如果你必须的话,这个翻译是线性时间。

result = {}; 

for (var category in categories) { 
    result[category._id] = {name : category.name, books: []}; 
} 

for (var book in books) { 
    //Probably also want some safety logic for if result[book.category] is undefined... 

    addBook(result[book.category].books, book); //you already know how to add your book info, so I won't duplicate that logic. 
} 

之后,您可以返回结果,或者执行逻辑以将结果更改为模拟的数据结构。但是创建这个初步结构将节省您的计算时间,因为字典访问比迭代您的数组要多得多。

如果b =书的数量和c =类别的数量。

复杂性你的算法:O(B * C)

复杂性我的算法:O(B + C)

复杂性我与翻译你的数据结构Ø算法(2 *(B + C) )虽然内存复杂度上升。在我看来,这个问题是一个很好的折衷。 O(b * c)不是很好。

+0

相当有洞察力。然而,这些数据是通过模型从MongoDB数据库中提取出来的,如果过滤看起来很复杂,也许我的数据建模都是错误的,显然是这样,因为我很快设置了数据库集合(I'米学习/试验这个东西)。这里要说的是,将来我应该对数据进行建模,同时考虑将要对其执行的查询类型。 – Duos 2014-10-16 14:53:23

+1

它看起来像我是你的数据模型正在思考的SQL ...这对SQL很好。但他们通常不会翻译成mongodb。或者至少,而不是让你有效的方式来操纵数据。但我不是这个词的任何意义上的mongodb专家。 – ChrisCM 2014-10-16 14:56:47

相关问题