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