卡住实施一个嵌套的数据过滤循环,可能是一个更优雅的方式做到这一点?

这是数据。 我想要做的就是将所有这些数据注入到一个包含所有类别和所有属于这些类别的书籍的variables中:

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是相当categories_titles[0].titles[0].title ,我有一种感觉,这可以更优雅地解决。

请指教。

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

 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. } 

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

如果b =书籍数量,c =类别数量。

复杂性你的algorithm:O(b * c)

复杂性我的algorithm:O(b + c)

复杂性我的algorithm与翻译到您的数据结构O(2 *(B + C))虽然内存复杂度上升。 在我看来,这个问题是一个很好的权衡。 O(b * c)不是很好。