GOOGLE ADS

vendredi 15 avril 2022

Fusionner des objets de différents tableaux

Je travaille sur quelque chose où je prends des données de 2 API différentes sur lesquelles je n'ai aucun contrôle et je veux combiner les résultats de la manière la plus efficace. L'un des tableaux contient des actifs, disons des livres, l'autre contient une transaction pour ledit livre. Voici un exemple:

{ 
author: {name: 'J.K. Rowling', },
assetName: 'Book1'
}]
const array2 = [
{from: 'John',
to: 'Sarah,
price: 10,
timeStamp: 123,
assetName: 'Book1',
authorName: 'J.K. Rowling'
}]

Notez que pour trouver la transaction correspondante pour un livre donné, vous avez besoin à la fois de assetName et authorName - vous pouvez posséder plus d'un livre du même auteur et vous pouvez posséder deux livres avec le même nom mais un auteur différent mais un auteur a un seul livre avec un nom donné, donc trouver la transaction correspondante à un actif nécessite que les deux champs correspondent et il n'y a pas d'autres identifiants uniques. L'approche naïve consiste à itérer sur l'un des tableaux et pour chaque entrée à vérifier dans le deuxième tableau pour trouver la transaction, mais cela semble prendre trop de temps à exécuter si les tableaux sont de taille substantielle. Je me demandais à quelles meilleures solutions pouvez-vous penser pour fusionner deux objets avec une structure différente qui soit efficace?


Solution du problème

Eh bien, si author.name+ assetNameforme un identifiant, vous pouvez parcourir une array1fois et créer un Mapavec les clés étant author.name + assetNameet les vales étant des objets originaux.

Ensuite, vous pouvez également répéter une array2fois et l'enrichir comme vous le souhaitez. Toutes les recherches dans la deuxième itération seront rapides puisque vous accéderez au Maplieu de chercher dans le tableau.

const indexedArray1 = new Map();
array1.forEach(data => indexedArray1.set(data.author.name + data.assetName, data);
const enrichedArray2 = array2.map(transaction => {
const relatedBook = indexedArray1.get(transaction.authorName + transaction.assetName);
// Merge relatedBook & transaction the way you want here
});

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...