JSON Index Compression

Sometimes you're transmitting denormalized data as a set and you don't want to incur the cost of all those repeated string values.

by khrome

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/mootools/1.4.5/mootools-core-full-compat.js"></script>

JavaScript

//todo: add object -> array conversion for more compression
var JSONIndex = {};

JSONIndex.compress = function(data){
    var map = [];
    var newData = [];
    var keys = Object.keys(data[0]);
    data.forEach(function(row, rowIndex){
        var newRow = [];
        for(key in row){
            if(key == '_id' || typeOf(row[key]) != 'string'){
                newRow.push(row[key]);
                continue;
            }
            if((index = map.indexOf(row[key])) && index != -1){
                newRow.push(''+index);
            }else{
                map.push(data[rowIndex][key]);
                newRow.push(''+(map.length-1));
            }
        }
        newData.push(newRow)
    });
    return {
        data : newData,
        map : map,
        keys : keys
    };
};

JSONIndex.expand = function(data){
    var newData = [];
    data.data.forEach(function(row, rowIndex){
        var newRow = {};
        data.keys.forEach(function(key, index){
            if(key === '_id' || typeOf(row[index]) != 'string' || isNaN(parseInt(row[index]))){
                console.log(row[index], key === '_id', typeOf(row[index]) != 'string', isNaN(parseInt(row[key])));
                newRow[key] = row[index];
            }else{
                newRow[key] = data.map[row[index]];
            }
        });
        newData.push(newRow);
    });
    return newData;
};

var val = JSONIndex.compress([
    {"something":"somethingelse", "fdsfddf":"adldsa", "somethring":"dfdfdfdff"},
    {"something":"somethingelse", "fdsfddf":"adldsa", "somethring":"dfdfdfdff"},
    {"something":"uwiueheh", "fdsfddf":"dffdfdf", "somethring":"dfdfdfdff"},
    {"something":"uwiueheh", "fdsfddf":"dffdfdf", "somethring":"dfdfdfdff"}
]);

document.write(JSON.encode(val)+'<br/><hr/>');
document.write(JSON.encode(JSONIndex.expand(val))+'<br/>');