Merging/Joining lodash 属性上的 2 个数组对象

Merging/Joining 2 array objects on attribute in lodash

是否可以根据两个数组中存在的属性合并两个数组对象。

我想通过 lodash 库来实现。

例如,考虑将 id 作为 PK 的类别列表和将 catagoryId 作为 FK 的电影列表

电影类别数组:

[{
    id: "cartoon",
    catagoryName:"Cartoon", 
},{
    id: "drama",
    catagoryName:"Drama",   
},{
    id: "action",
    catagoryName:"Action",  
}]

一系列电影。

[{
    categoryId:"action",
    movieName:"Spy",
    year: 2015
},{
    categoryId:"drama",
    movieName:"San Andreas",
    year: 2015
},{
    categoryId:"cartoon",
    movieName:"Rio",
    year: 2013
},{
    categoryId:"action",
    movieName:"Jurassic World",
    year: 2015
}]

我通过下划线或 lodash 寻找的输出。

[{
    id: "cartoon",
    catagoryName:"Cartoon",
    movies:[{
        categoryId:"cartoon",
        movieName:"Rio",
        year: 2013
    }]
},{
    id: "drama",
    catagoryName:"Drama",   
    movies:[{
        categoryId:"drama",
        movieName:"San Andreas",
        year: 2015
    }]
},{
    id: "action",
    catagoryName:"Action",
    movies:[{
        categoryId:"action",
        movieName:"Jurassic World",
        year: 2015
    },{
        categoryId:"action",
        movieName:"Spy",
        year: 2015
    }]  
}]

我知道我可以使用 for 循环来做到这一点,但想知道是否有更简洁的方法。

任何建议都可以提供帮助。这是节点 js 应用程序。

我使用 groupBy 按类别对电影进行分组,然后 map 通过使用适当的电影列表扩展它们来编辑类别。

groupedMovies = _.groupBy(movies, 'categoryId');

_.map(categories, function(cat) {
  return _.extend({movies: groupedMovies[cat.id] || []}, cat);
})

var categories =
[{
    id: "cartoon",
    catagoryName:"Cartoon",
},{
    id: "drama",
    catagoryName:"Drama",
},{
    id: "action",
    catagoryName:"Action",
}];

var movies =
[{
    categoryId:"action",
    movieName:"Spy",
    year: 2015
},{
    categoryId:"drama",
    movieName:"San Andreas",
    year: 2015
},{
    categoryId:"cartoon",
    movieName:"Rio",
    year: 2013
},{
    categoryId:"action",
    movieName:"Jurassic World",
    year: 2015
}];

groupedMovies = _.groupBy(movies, 'categoryId');
_.map(categories, function(cat) {
  return _.extend({movies: groupedMovies[cat.id] || []}, cat);
})

document.write("<pre>" + JSON.stringify(groupedMovies, null, 2) + "</pre>");
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.min.js"></script>

注意:categoriesmovies 都保持不变。