3 votes

Tableau imbriqué groupby de Lodash

J'essaie d'utiliser le groupBy de Lodash pour remodeler un tableau imbriqué.

J'obtiens les données de la librairie, où je récupère la liste des livres avec leur titre et la liste de leurs auteurs.

 [
     {
        "title": "",
        "author": [
          {
            "given": "",
            "family": "",
            "affiliation": []
          },
          {
            "given": "",
            "family": "",
            "affiliation": []
          }
         ]
      },{
        "title": "",
        "author": [
          {
            "given": "",
            "family": "",
            "affiliation": []
          },
          {
            "given": "",
            "family": "",
            "affiliation": []
          }
         ]
      }
    ]

Exemple complet avec entrée et sortie souhaitée

Ensuite, je veux regrouper ces livres par auteurs. Un livre appartient à plusieurs auteurs et nous cherchons à inverser la relation (Plus tard, je voudrais aussi les regrouper par affiliation et par auteur, mais restons simples pour le moment).

result = _.groupBy(result, function(item) {
   return _.map(item.author,'given')
});

Mon problème est que groupBy n'accepte pas un tableau de catégories dans lequel regrouper l'élément. Je dois trouver une solution alternative.

1voto

xNok Points 48

Réponse qui m'a été fournie par le Contributeur de Datalib

fonctions de tableau JavaScript standard

var byAuthor = books.reduce(function(authors, book) {
  book.author.forEach(function(author) {
    var name = author.family;
    var booksByAuthor = authors[name] || (authors[name] = []);
    booksByAuthor.push(book);
  });
  return authors;
}, {});

Solution alternative

Utilisation de json-groupby bibliothèque

const groupBy = require('json-groupby');

// create a temporary array `authors`
  byBook.forEach(function(item) {
      item.authors = item.author.map(function(x) {
         return x.family;
      })
  });

// groupby authors
  byAuthor= groupBy(byBook, ['authors']);

// delete the temporary array
  Object.keys(byAuthor).forEach(function (key){
    byAuthor[key].forEach(function (item){
      delete item.authors
    });
  });

0voto

piyush gupta Points 71

Cette librairie permet de définir des paramètres de regroupement multiples en s'appuyant sur d3.js et est extrêmement rapide. Vous pouvez peut-être en bénéficier

https://github.com/vega/datalib

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X