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/>');