Aplatissement et aplatissement d'objets JavaScript imbriqués : implémentations optimisées
La tâche d'aplatissement et d'aplatissement d'objets JavaScript complexes peut prendre beaucoup de temps. Voici une analyse complète pour optimiser cette opération :
Le défi :Un objet JavaScript doit être aplati avec "." comme délimiteur pour les clés d'objet et "[INDEX]" pour les tableaux.
Solution initiale : Le code fourni résout le problème mais est relativement lent.
Implémentation plus rapide (à l'aide d'expressions régulières) : Bergi introduit une implémentation nettement plus rapide à l'aide d'expressions régulières. Il aplatit l'objet en parcourant les propriétés aplaties et en créant des structures imbriquées en conséquence.
Implémentation la plus rapide (non-regex) : S'appuyant sur le concept de Bergi, l'implémentation fournie offre la non-regex la plus rapide version. Il suppose des règles spécifiques pour les noms de clés, à l'exclusion des entiers au début ou des points dans le nom.
Amélioration des performances de déaplatissement : AaditMShah améliore les performances de déaplatissement en utilisant une analyse de chemin en ligne au lieu de String.split. dans la boucle imbriquée.
Code final (unflatten):
Object.unflatten = function(data) { "use strict"; if (Object(data) !== data || Array.isArray(data)) return data; var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g, resultholder = {}; for (var p in data) { var cur = resultholder, prop = "", m; while (m = regex.exec(p)) { cur = cur[prop] || (cur[prop] = (m[2] ? [] : {})); prop = m[2] || m[1]; } cur[prop] = data[p]; } return resultholder[""] || resultholder; };
Code final (flatten):
Object.flatten = function(data) { var result = {}; function recurse (cur, prop) { if (Object(cur) !== cur) { result[prop] = cur; } else if (Array.isArray(cur)) { for(var i=0, l=cur.length; i<l; i++) recurse(cur[i], prop + "[" + i + "]"); if (l == 0) result[prop] = []; } else { var isEmpty = true; for (var p in cur) { isEmpty = false; recurse(cur[p], prop ? prop+"."+p : p); } if (isEmpty && prop) result[prop] = {}; } } recurse(data, ""); return result; };
Ces optimisations améliorent considérablement les performances d'aplatissement et de dé-aplatissement des imbriqués Objets JavaScript tout en respectant les exigences de compatibilité du navigateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!