Ответ 1
Самый эффективный способ найти первый индекс, соответствующий значению в несортированном массиве, - просто пройти по списку по порядку, то есть O (n). MDN также имеет некоторые подсказки:
Возвращает первый индекс, в котором данный элемент может быть найден в массиве, или -1, если он отсутствует.
[...]
fromIndex
По умолчанию: 0 (поиск целых массивов)
Индекс для начала поиска. Если индекс больше или равен длине массива, возвращается -1, что означает, что массив не будет искать. Если предоставленное значение индекса является отрицательным числом, оно принимается за смещение от конца массива. Примечание: если предоставленный индекс отрицательный, массив по-прежнему просматривается спереди назад. Если вычисленный индекс меньше 0, то весь массив будет искать.
Если вам интересно, здесь, как WebKit реализует его:
EncodedJSValue JSC_HOST_CALL arrayProtoFuncIndexOf(ExecState* exec)
{
// 15.4.4.14
JSObject* thisObj = exec->hostThisValue().toThis(exec, StrictMode).toObject(exec);
unsigned length = thisObj->get(exec, exec->propertyNames().length).toUInt32(exec);
if (exec->hadException())
return JSValue::encode(jsUndefined());
unsigned index = argumentClampedIndexFromStartOrEnd(exec, 1, length);
JSValue searchElement = exec->argument(0);
for (; index < length; ++index) {
JSValue e = getProperty(exec, thisObj, index);
if (exec->hadException())
return JSValue::encode(jsUndefined());
if (!e)
continue;
if (JSValue::strictEqual(exec, searchElement, e))
return JSValue::encode(jsNumber(index));
}
return JSValue::encode(jsNumber(-1));
}