Я получил этот вопрос при интервью с какой-то крупной компанией. Они попросили меня написать функцию next
, которая принимает массив в качестве входного значения и возвращает следующее доступное число.
Число с четным индексом в массиве указывает номер следующего числа в массиве с нечетным индексом. Например, [2,2,1,7,3,5]
означает, что у нас есть два 2
с, один 7
и 3 5
с. Таким образом, вызов next()
будет выводить 2
2
7
5
5
5
последовательно по одному за раз. И когда нет доступного числа, в этом случае, когда возвращается третий 5
, функция выдаст исключение.
Так что этот вопрос был довольно открытым. Они не указали явно, как я должен реализовать эту функцию. Единственное требование состояло в том, чтобы добиться поведения, упомянутого выше, то есть выводить следующее доступное число номер один за раз.
Во время интервью я подумал, что было бы целесообразно поместить эту функцию в цепочку прототипов Array
, чтобы мы могли Вызов этой функции непосредственно для массива, подобного этому
const array = [2, 2, 1, 7, 3, 5];
Array.prototype.next = function() {
const buffer = [];
let x;
let index = 0;
for (let i = 0; i < this.length; i++) {
if (i % 2 === 0) {
x = i;
} else {
buffer.push(...new Array(this[x]).fill(this[i]));
}
}
return buffer[index++];
};
console.log(array.next()); // 2
console.log(array.next()); // 2
console.log(array.next()); // 2
Я заметил, что люди говорят, что плохая идея сделать функцию частью прототипа Array
. Итак, вот другое решение
function getNext(array) {
const buffer = [];
let x;
let index = 0;
for (let i = 0; i < array.length; i++) {
if (i % 2 === 0) {
x = i;
} else {
buffer.push(...new Array(array[x]).fill(array[i]));
}
}
return buffer[index++];
}
Однако проблема в том, что он не запоминает последний вывод и переходит к следующему. Он всегда будет выводить первый элемент в массиве.
Я всегда думал, что, может быть, мы сможем реализовать этот next
в качестве итератора, но я сам не смог его реализовать.
Может кто-нибудь мне помочь с этим?