Внутренний код, используемый для установки и получения ключей, зависит от реализации. Выход (и порядок) гарантирован (для всех методов перечисления свойств, начиная с ES2020 ), но механизм зависит от реализатора. Вам придется взглянуть на исходный код двигателя для этого.
Я не знаю код, по которому различные двигатели Javascript работают под капотом, но если вы знаете верхнюю границу для число в массиве, это это возможно в O(n)
(или, точнее, O(n + k)
, где k
- это константа - верхняя граница) с помощью сортировки счетом: создайте карту ключей (аналогично тому, как вы это делаете, но с учетом количества раз, которое появляется каждый элемент), затем выполните итерацию от 0 до верхней границы, проверяя, включено ли число, которое повторяется, в ключах. Если это так, pu sh в массив:
let o = {};
let a = [4, 1, 3, 9, 7, 19, 11];
// O(n)
for (const num of a) {
if (!o[num]) {
o[num] = [];
}
o[num].push(num);
}
// O(n). This part isn't strictly necessary, but the alternative makes the code uglier
const max = Math.max(...a);
const result = [];
// O(k)
for (let i = 0; i <= max; i++) {
if (o[i]) {
// total of O(n) items pushed over the whole loop
result.push(...o[i]);
}
}
console.log(result);
Если, как и в вашем примере, повторяющихся чисел нет, код значительно упрощается:
let o = {};
let a = [4, 1, 3, 9, 7, 19, 11];
for (const num of a) {
o[num] = true;
}
// O(n)
const max = Math.max(...a);
const result = [];
// O(k)
for (let i = 0; i <= max; i++) {
if (o[i]) {
// total of O(n) items pushed over the whole loop
result.push(i);
}
}
console.log(result);