разбить массив на lodash на основе подмассива, сохраняющего запись массива - PullRequest
0 голосов
/ 29 августа 2018

У меня есть массив, как показано ниже. Как видите, книга может иметь много авторов. Но я хочу сгруппировать книгу по автору. Но независимо от того, что я хочу сначала разбить массив так, чтобы несколько авторов были разбиты на одного автора, а другой отправится на создание нового набора массива.

[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()

Мое решение на самом деле работает, поскольку оно выравнивает массив, но моя проблема в том, что оно возвращает только «авторов», я также хочу получить информацию «книг».

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Это можно сделать простым JavaScript.

const books = [{    'book_name': 'book1',
    'authors': [{author_id:'value2',
                author_name: 'Name2'}] },
   {'book_name': 'book2',
    'authors': [{author_id:'value3',
                author_name: 'Name3'},
                {author_id:'value4',
                author_name: 'Name4'}] }];

const arr = [];
books.map((book)=>{ 
    book.authors.forEach((author) => {
        arr.push({ 
               book_name: book.book_name,
               authors: [author]   
         }); 
       }); 
     })
console.log(arr);
0 голосов
/ 29 августа 2018

На самом деле вам не нужно 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);
...