Non manca nulla. È un po 'sorprendente, no?
biblioteca
Google Chiusura fa le funzioni di supporto all'interno di binarySearch (sono sicuro che ci sono altri):
http://docs.closure-library.googlecode.com/git/namespace_goog_array.html
si dovrebbe utilizzare, proprio come ci si immagina:
var myArray = getPetArray();
goog.array.binarySearch(myArray, 'fido', function(pet) { return pet.name; });
Se non vuoi trascinare in un'altra libreria, la fonte è breve e disponibile:
http://docs.closure-library.googlecode.com/git/local_closure_goog_array_array.js.source.html#line989
taglio e incollo la parte importante nel caso in cui collega il cambiamento - basta ricordarsi di dare credito a Google:
goog.array.binarySearch = function(arr, target, opt_compareFn) {
return goog.array.binarySearch_(arr,
opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
target);
};
goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target,
opt_selfObj) {
var left = 0; // inclusive
var right = arr.length; // exclusive
var found;
while (left < right) {
var middle = (left + right) >> 1;
var compareResult;
if (isEvaluator) {
compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
} else {
compareResult = compareFn(opt_target, arr[middle]);
}
if (compareResult > 0) {
left = middle + 1;
} else {
right = middle;
// We are looking for the lowest index so we can't return immediately.
found = !compareResult;
}
}
// left is the index if found, or the insertion point otherwise.
// ~left is a shorthand for -left - 1.
return found ? left : ~left;
};
goog.array.defaultCompare = function(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
};
fonte
2014-09-21 21:34:34
curioso: che cosa stai facendo che una ricerca binaria fa la differenza tra trattabili e inaccettabile? Quanto è grande il tuo array e cosa stai facendo? –
Una ricerca binaria deve essere eseguita su un array ordinato. Poiché hai una serie di oggetti, molto probabilmente avrai bisogno di una soluzione personalizzata. –
L'array stesso è di circa 1000 articoli, ma ho bisogno di trovare elementi in esso molte volte. Quindi una ricerca lineare di questa matrice in un ciclo potrebbe non essere molto efficiente. – Naresh