Maison > interface Web > js tutoriel > Comment puis-je optimiser l'aplatissement et la désaplatissement des objets JavaScript imbriqués ?

Comment puis-je optimiser l'aplatissement et la désaplatissement des objets JavaScript imbriqués ?

Linda Hamilton
Libérer: 2024-12-29 08:30:11
original
849 Les gens l'ont consulté

How Can I Optimize Flattening and Unflattening Nested JavaScript Objects?

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;
};
Copier après la connexion

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 &amp;&amp; prop)
                result[prop] = {};
        }
    }
    recurse(data, "");
    return result;
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal