Saltar al contenido

¿Tamaño del objeto json? (en KB / MB)

Solución:

Una respuesta a la pregunta real debe incluir los bytes gastados en los encabezados y debe incluir tener en cuenta la compresión gzip, pero ignoraré esas cosas.

Tienes pocas opciones. Todos dan la misma respuesta cuando se ejecutan:

Si usa un navegador o un nodo (no IE)

const size = new TextEncoder().encode(JSON.stringify(obj)).length
const kiloBytes = size / 1024;
const megaBytes = kiloBytes / 1024;

Si necesita que funcione en IE, puede usar un pollyfill

Si usa nodo

const size = Buffer.byteLength(JSON.stringify(obj))

(que es lo mismo que Buffer.byteLength(JSON.stringify(obj), "utf8")).

Acceso directo que funciona en IE, navegadores modernos y nodo

const size = encodeURI(JSON.stringify(obj)).split(/%..|./).length - 1;

Esa última solución funcionará en casi todos los casos, pero esa última solución arrojará un URIError: URI malformed excepción si lo alimenta con una entrada que contiene una cadena que no debería existir, como let obj = { partOfAnEmoji: ""[1] }. Las otras dos soluciones que proporcioné no tendrán esa debilidad.

(Créditos: El crédito por la primera solución va aquí. El crédito por la segunda solución va para el paquete utf8-byte-length (lo cual es bueno, podría usarlo en su lugar). La mayor parte del mérito de esa última solución es aquí, pero lo simplifiqué un poco. Encontré el conjunto de pruebas del paquete utf8-byte-length super útil, al investigar esto).

Para ascii, puede contar los caracteres si lo hace …

JSON.stringify({
  'a': 1,
  'b': 2
}).length

Si también tiene caracteres especiales, puede pasar a través de una función para calcular la longitud de caracteres UTF-8 …

function lengthInUtf8Bytes(str) {
  // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
  var m = encodeURIComponent(str).match(/%[89ABab]/g);
  return str.length + (m ? m.length : 0);
}

Debe ser precisa …

var myJson = JSON.stringify({
  'a': 1,
  'b': 2,
  'c': 'Máybë itß nºt that sîmple, though.'
})

// simply measuring character length of string is not enough...
console.log("Inaccurate for non ascii chars: "+myJson.length)

// pass it through UTF-8 length function...
console.log("Accurate for non ascii chars: "+ lengthInUtf8Bytes(myJson))

/* Should echo...

Inaccurate for non ascii chars: 54
Accurate for non ascii chars: 59

*/

Demostración de trabajo

Aquí hay una función que hace el trabajo.

function memorySizeOf(obj) {
    var bytes = 0;

    function sizeOf(obj) {
        if(obj !== null && obj !== undefined) {
            switch(typeof obj) {
            case 'number':
                bytes += 8;
                break;
            case 'string':
                bytes += obj.length * 2;
                break;
            case 'boolean':
                bytes += 4;
                break;
            case 'object':
                var objClass = Object.prototype.toString.call(obj).slice(8, -1);
                if(objClass === 'Object' || objClass === 'Array') {
                    for(var key in obj) {
                        if(!obj.hasOwnProperty(key)) continue;
                        sizeOf(obj[key]);
                    }
                } else bytes += obj.toString().length * 2;
                break;
            }
        }
        return bytes;
    };

    function formatByteSize(bytes) {
        if(bytes < 1024) return bytes + " bytes";
        else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB";
        else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB";
        else return(bytes / 1073741824).toFixed(3) + " GiB";
    };

    return formatByteSize(sizeOf(obj));
};

console.log(memorySizeOf({"name": "john"}));

Obtuve el fragmento de la siguiente URL

https://gist.github.com/zensh/4975495

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *