Ответ 1
Если у вас есть среда ES2015 (начиная с этой записи: io.js, IE11, Chrome, Firefox, WebKit в ночное время), то следующее будет работать и будет быстрым (а именно, O (n)):
function hasDuplicates(array) {
return (new Set(array)).size !== array.length;
}
Если вам нужны только строковые значения в массиве, то будет работать следующее:
function hasDuplicates(array) {
var valuesSoFar = Object.create(null);
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (value in valuesSoFar) {
return true;
}
valuesSoFar[value] = true;
}
return false;
}
Мы используем "хеш-таблицу" valuesSoFar
, ключи которой являются значениями, которые мы видели в массиве. Мы выполняем поиск с помощью in
, чтобы узнать, было ли это значение уже обнаружено; если это так, мы выходим из цикла и возвращаем true
.
Если вам нужна функция, которая работает не только для строковых значений, то следующее будет работать, но не так эффективно; это O (n 2) вместо O (n).
function hasDuplicates(array) {
var valuesSoFar = [];
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (valuesSoFar.indexOf(value) !== -1) {
return true;
}
valuesSoFar.push(value);
}
return false;
}
Различие просто в том, что мы используем массив вместо хеш-таблицы для valuesSoFar
, так как "хэш-таблицы JavaScript" (т.е. объекты) имеют только строковые ключи. Это означает, что мы теряем время поиска O (1) in
, вместо этого получаем время поиска O (n) indexOf
.