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>
注意:categories
和 movies
都保持不变。
是否可以根据两个数组中存在的属性合并两个数组对象。
我想通过 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>
注意:categories
和 movies
都保持不变。