J'ai 2 gros fichiers json avec chaque 200k objets et quand j'essaye de faire une boucle entre 2 jsons pour un identifiant commun, cela prend plus de temps pour l'exécution.
Implémentation 1
var activityData = { "data": [ { "id":285568423, "type": "ExpenseEntry", "date": "2011-01-01", "quantity_in_hours": 1, "rounded_quantity_in_hours": 1, "quantity": 1, "rounded_quantity": 1, "price": 100, "matter": { "id": 1055395769 } }, { "id": 285568428, "type": "MonEntry", "matter": { "id": 1055395769 } }, { "id": 285568442, "type": "EEntry", "matter": { "id": 1055395769 }}] };
Mise en œuvre 2
var matterData= { "data": [ { "id": 1055395769, "description": "Peters", "status": "Pending", "location": null, "client_reference": "1532", "billable": true, "billing_method": "hourly", "open_date": "2019-06-05", "close_date": null, } ] };
Mise en œuvre 3
Chaque implémentation prend plus de temps à s'exécuter.
ActivitiesData aura un identifiant et aussi matière.id qui est lié à matièreData.id
Tout informations, veuillez aider
Données importantes
for (var i in matterData.data) { matters_array = []; for (var j in activityData.data) { if (activityData.data[j]["matter"] !== null) { if (matterData.data[i].id === activityData.data[j]["matter"].id) { matters_array.push(activityData.data[j]); } if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array; } } }
Données d'activités
for (var i in matterData.data) { //Activities matters_array = []; matters_array = activityData.data.filter(function (el) { if (el.matter !== null) return el.matter.id == matterData.data[i].id; }); if (matters_array.length > 0) matterData.data[i]["activities"] = matters_array; }
4 Réponses :
Vous exécutez une boucle O (n ^ 2) qui représente près de 200 000 * 200 000 boucles. C'est un gros calcul à gérer. Vous pouvez réduire cette complexité en utilisant map. Stockez toutes les valeurs de activityData.data
dans la carte avec l'ID. Et puis parcourez un matièreData.data
pour vérifier si l'ID existe dans la carte.
Implémentation de la réponse avec ruhul
const map = Object.create(null); const res = []; // Store all values of matterData.data in map with id. matterData.data.forEach(item => (map[item.id] = item)); // iterate over one activityData.data to check if the id exists in map. activityData.data.forEach(item => { const { id } = item; if (map[id]) { res.push(item); } });
json mis à jour pour 2 objets .. Le code ci-dessus doit être modifié
Commencez par créer une carte contenant id comme clé et matière.data comme valeur et créez un tableau vide pour l'activité, puis parcourez l'activité et poussez l'activité dans un tableau vide
const map = {} for( var i in matterData.data){ map[matterData.data[i].id] = matterData.data[i]; matterData.data[i].activities = []; } for(var i in activityData.data){ var matter = map[activityData.data[i].matter.id]; matter.activities.push(activityData.data[i]); } for( var i in matterData.data){ console.log(matterData.data[i]); }
Cette solution fonctionne seulement si matièreData.data [i] .id est unique
Le Set.has est O (1) qui, je pense, peut être utilisé efficacement à cette fin.
var subSet = new Set(activityData.data.map(obj => {obj.matter.id})); for (var i in matterData.data) { const ma_array = []; if (subSet.has(matterData.data[i].id){ ... } }
Vous devrez peut-être commencer par trier le JSON par identifiant, même si je ne sais pas à quoi ressemble l'ID. Si l'ID est un nombre, une fois trié, utilisez un algorithme de recherche binaire. Quant à l'algorithme de tri, cela dépend de vous car il y a beaucoup d'options.