JsonBuffer calculator now generates more compact expression

This commit is contained in:
Benoit Blanchon
2016-09-29 22:22:18 +02:00
committed by Benoit Blanchon
parent e6f55b1f6f
commit cbfd331e50

View File

@ -51,21 +51,55 @@
</div>
</body>
<script type="text/javascript">
function getExpression(obj) {
var elements = [];
if (obj instanceof Array) {
elements.push("JSON_ARRAY_SIZE(" + obj.length + ")");
for (var i = 0; i<obj.length; i++) {
elements.push(getExpression(obj[i]))
function Recipe() {
var arrays = [];
var objects = [];
this.addJsonArray = function(size) {
if (arrays[size])
arrays[size]++;
else
arrays[size] = 1;
}
this.addJsonObject = function(size) {
if (objects[size])
objects[size]++;
else
objects[size] = 1;
}
this.getExpression = function() {
var elements = [];
for (var size in arrays) {
var count = arrays[size];
if (count > 1)
elements.push(count + "*JSON_ARRAY_SIZE("+size+")");
else
elements.push("JSON_ARRAY_SIZE("+size+")");
}
for (var size in objects) {
var count = objects[size];
if (count > 1)
elements.push(count + "*JSON_OBJECT_SIZE("+size+")");
else
elements.push("JSON_OBJECT_SIZE("+size+")");
}
return elements.join(" + ");
}
}
function scanJson(recipe, obj) {
if (obj instanceof Array) {
recipe.addJsonArray(obj.length);
for (var i = 0; i<obj.length; i++)
scanJson(recipe, obj[i]);
}
else if (obj instanceof Object) {
elements.push("JSON_OBJECT_SIZE(" + Object.keys(obj).length + ")");
for (var key in obj) {
elements.push(getExpression(obj[key]))
}
recipe.addJsonObject(Object.keys(obj).length);
for (var key in obj)
scanJson(recipe, obj[key]);
}
return elements.filter(function(x){return x.length > 0}).join(" + ");
}
input.oninput = function(e) {
@ -73,8 +107,9 @@
error.style.visibility = 'hidden';
try {
var obj = JSON.parse(input.value);
var expression = getExpression(obj);
var recipe = new Recipe();
scanJson(recipe, JSON.parse(input.value));
var expression = recipe.getExpression();
resultexpr.innerText = expression;
sizeavr8.innerText = eval(