2014-10-16 44 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

相關問題