这是数据。我要做的是将所有这些数据注入一个变量,该变量包含所有类别和属于这些类别的所有书籍:
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
是相当怪异的,我觉得这可以更优雅地解决。请指教。
最佳答案
确实有更好的方法可以做到这一点。我将重新排列您的数据结构。从我的数据结构转到您的数据结构的过滤器是线性时间算法,尽管我不明白您为什么要这样做。但是,如果必须的话,转换是线性时间。
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)
复杂度我的算法可以转换为您的数据结构O(2 *(b + c)),尽管内存复杂度有所提高。在我看来,这是一个很好的折衷方案。 O(b * c)不太好。