JSFiddle - React, Tailwind, and code Playground
HTML
<html>
<head>
<title>WalkObject - an Asynchronous recursive Object walker</title>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.js"></script>
</head>
<body>
<div id="log">
</div>
</body>
</html>
JavaScript
var sa = { m : {
walkObject : function (cmd) {
/*
walkObject.*() is COPYLEFTED - PERPETUALLY FREE FOR ALL TYPES OF USAGE
DISCLAIMER : NO WARRANTIES EXPRESSED OR IMPLIED, USE ONLY AT YOUR OWN RISK
(c) and (r) 2014-Nov by Rene Veerman <info@seductiveapps.com>
this code has been tested on large arrays (>2MB in size, <100MB in size)
*/
cmd.scanPointer = cmd.val;
if (!cmd.origin) {
cmd.origin = '[unknown origin]';
}
if (!cmd.levelsAtOnce) {
cmd.levelsAtOnce = 1;
}
setTimeout (function () {
sa.m.walkObject_scan (cmd, sa.m.walkObject_processList);
}, 50);
},
walkObject_callbackScan : function (pvCmd) {
if (cmd.progressbarHTMLid) {
var el = document.getElementById(cmd.progressbarHTMLid);
sa.pbar.setPercentage (el, cmd.scanIdx, cmd.scanResults.length);
}
},
walkObject_scan : function (cmd, callback) {
if (!cmd.scanResults) {
cmd.scanResults = [{level:1, path:'', d:cmd.scanPointer}];
cmd.scanIdx = 0;
cmd.scanCount = 0;
cmd.lastPause = 0;
cmd.scanCallback = callback;
};
sa.m.walkObject_scanItem (cmd);
if (typeof cmd.callbackScan=='function') {
cmd.callbackScan (cmd);
};
if (cmd.scanIdx==cmd.scanResults.length) {
if (typeof cmd.scanCallback=='function') {
setTimeout (function () {
cmd.scanCallback (cmd);
}, 300);
}
return true; // scanning done!
}
var pauseFactor = cmd.scanIdx;
if (pauseFactor > cmd.lastPause + 50) {
sa.m.log (1211, 'sa.m.walkObject_scan(): pausing for 500 milliseconds');
setTimeout (function () {
cmd.lastPause = pauseFactor;
sa.m.walkObject_scan(cmd);
}, 500);
return false;
} else {
return sa.m.walkObject_scan(cmd);
};
},
walkObject_scanItem : function (cmd, path) {
var it = cmd.scanResults[cmd.scanIdx];
var tit = typeof it.d;
if (tit=='object') {
if (!it.keys) {
it.keys = Object.keys (it.d);
it.keys.reverse();
it.keyIdx = 0;
}
}
if (it.keys) {
if...