Javascript 无法实现嵌套的数据过滤循环,这可能是一种更优雅的方式吗?

Javascript 无法实现嵌套的数据过滤循环,这可能是一种更优雅的方式吗?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,这是数据。我要做的是将所有这些数据注入一个变量,该变量包含所有类别以及属于这些类别的所有书籍: var categories = [ // ... { "_id" : "5436b12b456f61180f815c06", "name" : "Horror" }, { "_id" : "5436b43f18bbc8a8073e786e", "name" : "Action" }

这是数据。我要做的是将所有这些数据注入一个变量,该变量包含所有类别以及属于这些类别的所有书籍:

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\u 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)不是很好。

很有见地。然而,这些数据是由一个模型从MongoDB数据库中提取的,如果过滤看起来如此复杂,也许我的数据建模完全错了,这显然是因为我匆忙地设置了数据库集合(我正在学习/实验这些东西)。这里的要点是,在未来,我应该在考虑将对数据执行的查询类型的同时对数据进行建模。在我看来,您的数据模型是根据SQL进行思考的。。。这对SQL非常有用。但它们通常不能很好地转换为mongodb。或者至少,在给您留下操作数据的有效方法的同时。但我不是任何意义上的mongodb专家。