Я бы хотел найти следующий модуль данных по языку books.lang
, используя .map()
и .filter()
.Если язык не определен, функция возвращает всех авторов с относительными книгами.Если запрашивается язык, функция возвращает только авторов, у которых есть книги, переведенные на этот язык.
Модуль данных имеет следующий вид:
// data.js
const authors = [
{
id: 1,
name: "Author 1"
},
{
id: 2,
name: "Author 2"
},
{
id: 3,
name: "Author 3"
}
];
const books = [
{
id: 1,
authorId: 1,
lang: "IT",
title: "Title 1",
date: "2018-06-07"
},
{
id: 2,
authorId: 1,
lang: "EN",
title: "Title 2",
date: "2018-06-07"
},
{
id: 3,
authorId: 2,
lang: "IT",
title: "Title 1",
date: "2018-06-07"
},
{
id: 4,
authorId: 2,
lang: "FR",
title: "Title 2",
date: "2018-06-07"
},
{
id: 5,
authorId: 3,
lang: "IT",
title: "Title 1",
date: "2018-07-07"
}
];
module.exports = { authors, books };
Распространенное решение работает с использованием классического цикла for.Но я не могу найти правильное решение, используя только .map()
и .filter()
и, в конечном счете, объединяя их в цепочку, оно не группирует книги по автору.Для каждого автора я создаю свойство books
для группировки относительных книг.
Классическим рабочим решением является следующее:
const lang = "IT";
filtered_books = books.filter( book => lang !== null ? book.lang == lang : book.lang !== '' );
for (let i in authors) {
authors[i].books = filtered_books.filter( book => book.authorId == authors.id);
}
Вот где я застрял с моим .map()
и .filter()
решение:
const lang = "IT";
const selectedAuthors = books.filter( book => lang !== null ? book.lang == lang : book.lang !== '' )
.map( book => {
return authors.filter( author => {
if(author.id == book.authorId) return author.books = book; // Should I push something here?
});
});
С параметром lang
или без него он не группирует полученные книги по автору.
Большое спасибо за любые советы.