首页 > 解决方案 > 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()

我的解决方案实际上有效,因为它使数组变平,但我的问题是它只返回“作者”,我还想检索“书籍”信息。

标签: javascriptarrayslodash

解决方案


实际上你不需要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);


推荐阅读