(function(document){"use strict";
var textarea = document.getElementById('inputbox'),
searchinput = document.getElementById('search'),
searchStart = document.getElementById('start'),
searchedLength = document.getElementById('length'),
resultbox = document.getElementById('result'),
timeoutID = -1;
function doUpdate(){
try {
var txt = textarea.value.replace(/\s*\[|\]\s*/g, '').split(',');
var arr = JSON.parse(textarea.value);
var searchval = JSON.parse(searchinput.value);
var textmtchs = textarea.value.match(/\s*\[|\]\s*/g);
var start = searchStart.value || void 0;
var sub = searchedLength.value || void 0;
txt = refSort(txt, arr);
textarea.value = textmtchs[0] +
txt.join(',') +
textmtchs[textmtchs.length-1];
arr = JSON.parse(textarea.value);
resultbox.value = fastBinarySearch(arr, searchval, start, sub);
} catch(e) {
resultbox.value = 'Error';
}
}
textarea.oninput = searchinput.oninput =
searchStart.oninput = searchedLength.oninput =
textarea.onkeyup = searchinput.onkeyup =
searchStart.onkeyup = searchedLength.onkeyup =
textarea.onchange = searchinput.onchange =
searchStart.onchange = searchedLength.onchange = function(e){
clearTimeout( timeoutID );
timeoutID = setTimeout(doUpdate, e.target === textarea ? 384 : 125);
}
function refSort(targetData, refData) {
var indices = Object.keys(refData);
indices.sort(function(indexA, indexB) {
if (refData[indexA] < refData[indexB]) return -1;
if (refData[indexA] > refData[indexB]) return 1;
return 0;
});
return indices.map(function(i){ return targetData[i] })
}
function fastBinarySearch(array, sValue, ARG_start, ARG_len) {
var start = ARG_start | 0;
var len = ARG_len === void 0 ? (array.length|0) - start |0 : ARG_len|0;
var offset = 0, nCB = 0;
if ((start + 0x00007fff|0) < len) {
if ((start + 0x007fffff|0) < len) {
if ((start + 0x07ffffff|0) < len) {
if ((start + 0x1fffffff|0) < len) {
if ((offset = start + 0x3fffffff|0) < len) {
start = start + ((array[offset] < sValue) << 30) | 0;
}
if ((offset = start + 0x1fffffff|0) < len) {
start = start + ((array[offset] < sValue) << 29) | 0;
}
}
if ((offset = start + 0x0fffffff|0) < len) {
start = start + ((array[offset] < sValue) << 28) | 0;
}
if ((offset = start + 0x07ffffff|0) < len) {
start = start + ((array[offset] < sValue) << 27) | 0;
}
}
if ((start + 0x01ffffff|0) < len) {
if ((offset = start + 0x03ffffff|0) < len) {
start = start + ((array[offset] < sValue) << 26) | 0;
}
if ((offset = start + 0x01ffffff|0) < len) {
start = start + ((array[offset] < sValue) << 25) | 0;
}
}
if ((offset = start + 0x00ffffff|0) < len) {
start = start + ((array[offset] < sValue) << 24) | 0;
}
if ((offset = start + 0x007fffff|0) < len) {
start = start + ((array[offset] < sValue) << 23) | 0;
}
}
if ((start + 0x0007ffff|0) < len) {
if ((start + 0x001fffff|0) < len) {
if ((offset = start + 0x003fffff|0) < len) {
start = start + ((array[offset] < sValue) << 22) | 0;
}
if ((offset = start + 0x001fffff|0) < len) {
start = start + ((array[offset] < sValue) << 21) | 0;
}
}
if ((offset = start + 0x000fffff|0) < len) {
start = start + ((array[offset] < sValue) << 20) | 0;
}
if ((offset = start + 0x0007ffff|0) < len) {
start = start + ((array[offset] < sValue) << 19) | 0;
}
}
if ((start + 0x0001ffff|0) < len) {
if ((offset = start + 0x0003ffff|0) < len) {
start = start + ((array[offset] < sValue) << 18) | 0;
}
if ((offset = start + 0x0001ffff|0) < len) {
start = start + ((array[offset] < sValue) << 17) | 0;
}
}
if ((offset = start + 0x0000ffff|0) < len) {
start = start + ((array[offset] < sValue) << 16) | 0;
}
if ((offset = start + 0x00007fff|0) < len) {
start = start + ((array[offset] < sValue) << 15) | 0;
}
}
if ((start + 0x0000007f|0) < len) {
if ((start + 0x000007ff|0) < len) {
if ((start + 0x00001fff|0) < len) {
if ((offset = start + 0x00003fff|0) < len) {
start = start + ((array[offset] < sValue) << 14) | 0;
}
if ((offset = start + 0x00001fff|0) < len) {
start = start + ((array[offset] < sValue) << 13) | 0;
}
}
if ((offset = start + 0x00000fff|0) < len) {
start = start + ((array[offset] < sValue) << 12) | 0;
}
if ((offset = start + 0x000007ff|0) < len) {
start = start + ((array[offset] < sValue) << 11) | 0;
}
}
if ((start + 0x000001ff|0) < len) {
if ((offset = start + 0x000003ff|0) < len) {
start = start + ((array[offset] < sValue) << 10) | 0;
}
if ((offset = start + 0x000001ff|0) < len) {
start = start + ((array[offset] < sValue) << 9) | 0;
}
}
if ((offset = start + 0x000000ff|0) < len) {
start = start + ((array[offset] < sValue) << 8) | 0;
}
if ((offset = start + 0x0000007f|0) < len) {
start = start + ((array[offset] < sValue) << 7) | 0;
}
}
if ((start + 0x00000007|0) < len) {
if ((start + 0x0000001f|0) < len) {
if ((offset = start + 0x0000003f|0) < len) {
start = start + ((array[offset] < sValue) << 6) | 0;
}
if ((offset = start + 0x0000001f|0) < len) {
start = start + ((array[offset] < sValue) << 5) | 0;
}
}
if ((offset = start + 0x0000000f|0) < len) {
start = start + ((array[offset] < sValue) << 4) | 0;
}
if ((offset = start + 0x00000007|0) < len) {
start = start + ((array[offset] < sValue) << 3) | 0;
}
}
offset = start + 0x00000003|0;
nCB = -(offset < len|0) | 0;
start = start + (((array[offset & nCB] < sValue) << 2) & nCB) | 0;
offset = start + 0x00000001|0;
nCB = -(offset < len|0) | 0;
start = start + (((array[offset & nCB] < sValue) << 1) & nCB) | 0;
offset = start;
nCB = -(offset < len|0) | 0;
start = start + ((array[offset & nCB] < sValue) & nCB) | 0;
if (array[start|0] !== sValue) {
return -1 - start |0;
}
return start |0;
}
})(document);
<h3 style="margin:.125em;width:100%;text-align:center">The Array (Must Be A Valid JSON Array)</h3>
<textarea placeholder="[-24, -12, 0, 0, 9, 16, 18, 64, 80]" type="text" rows=6 style="width:calc(100% - .5em);display:block" id="inputbox">[-24, -12, 0, 0, 9, 16, 18, 64, 80]</textarea>
<table style="table-layout:fixed;font-size:1.2em" width="100%"><tbody>
<tr>
<td colspan="3">Search Value: <input type="text" id="search" value="-12" style="width:8em;text-align:center;float:right" /></td>
<td></td>
<td colspan="3">Resulting Index: <input type="text" id="result" value="1" style="width:8em;text-align:center;float:right" readonly="" />
</tr>
<tr>
<td colspan="3">Start Index: <input type="text" id="start" value="" placeholder="(0)" style="width:8em;text-align:center;float:right" /></td>
<td></td>
<td colspan="3">Searched Length: <input type="text" id="length" value="" placeholder="(array length)" style="width:8em;text-align:center;float:right" />
</tr>
</tbody></table>
return binarySearch(...)
。 - cmbuckley