陷入了实现嵌套数据过滤循环的困境,这可能是一种更优雅的方法
Stuck implementing a nested data filtering loop, possibly a more elegant way of doing this?
这是数据。我想做的是将所有这些数据注入一个变量中,该变量包含所有类别和属于这些类别的所有书籍:
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)不是很好。
相关文章:
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 有没有一种方法可以仅使用HTML/CSS来隐藏基于特定值的数据单元格
- 有没有一种方法可以从URL跟踪请求的域
- 有没有一种方法可以列出Ember.Object的所有绑定
- 有没有一种方法可以获得three.js的最小/lite版本
- 有没有一种方法可以在没有文档或jQuery的情况下使用javascript解码html实体
- 有没有一种方法可以从Javascript检测特定的应用程序是否安装在(AndroidiOS)设备上
- 在HTML/JavaScript中,有没有一种方法可以在图像开始加载时知道图像的最终布局尺寸
- 有没有一种方法可以在Javascript中进行可变递归currying
- 有没有一种方法可以检测ios<>使用jquery和触发器操作形成导航按钮
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- jQuery:使用substr()的另一种方法
- 有没有一种方法可以直接从cordova获得滚动位置
- 有没有一种方法可以通过只引用JavaScript来执行代码
- firebase中有没有一种方法可以防止快速连续写入
- GWT:有没有一种方法可以修改GWT在编译中使用的Cast.java文件
- 在Javascript(jquery)中,有没有一种方法可以检测页面锚点何时更改