javascript - lodash 基于保留数组记录的子数组分解数组
问题描述
我有一个像下面这样的数组。如您所见,一本书可以有许多作者。但我想按作者对这本书进行分组。但不管我想先打破数组,以便将多个作者分解为一个作者,另一个作者将去创建一组新的数组。
[0]
'book_name': 'book1'
'authors': array(1)
0:
author_id:'value2'
author_name: 'Name2'
[1]
'book_name': 'book2'
'authors': array(2)
0:
author_id:'value1'
author_name: 'Name1'
1:
author_id:'value2'
author_name: 'Name2'
我想要这样的预期输出
[0]
'book_name': 'book1'
'authors': array(1)
0:
author_id:'value2'
author_name: 'Name2'
[1]
'book_name': 'book2'
'authors': array(1)
0:
author_id:'value1'
author_name: 'Name1'
[2]
'book_name': 'book2'
'authors': array(1)
0:
author_id:'value2'
author_name: 'Name2'
到目前为止我所做的是:
grouping = _.chain(books)
.flatMap('authors')
.groupBy('author_id')
.value()
我的解决方案实际上有效,因为它使数组变平,但我的问题是它只返回“作者”,我还想检索“书籍”信息。
解决方案
实际上你不需要lodash
达到你期望的结果:
const books = [
{
'book_name': 'book1',
'authors': [
{
author_id: 'value2',
author_name: 'Name2',
},
],
},
{
'book_name': 'book2',
'authors': [
{
author_id: 'value1',
author_name: 'Name1',
},
{
author_id: 'value2',
author_name: 'Name2',
}
],
},
];
const transformed = books.reduce((accumulator, book) => {
const authors = book.authors.map(author => ({
...book,
authors: [author]
}));
return accumulator.concat(authors);
}, []);
console.log('original', books);
console.log('transformed', transformed);
推荐阅读
- css - 如何从外部css文件导入字体
- php - 拆分和分解重定向
- java - 在 Mongo 中插入 JSON
- xpath - 如果存在则选择元素的子元素,否则选择父元素
- asp.net-core - ASP.NET core 自定义日志注入
- f# - 具有模式匹配的 F# 分支逻辑
- amazon-web-services - AWS Cloudwatch 过滤器和模式语法
- java - 如何将字符串切成这样的数组?
- firebase - “必须依赖 com.google.firebase:firebase-core”,但我有一个
- flutter - 错误 Flutter Firebase 身份验证和 Google 登录