Генератор может проверить результат yield
, и, если это определенное выражение (например, 'prev'
), уменьшите i
вместо его увеличения:
const array = ['a', 'b', 'c'];
function* f(array) {
let i = 0;
while (true) {
const incOrDec = (yield array[i]) === 'prev' ? -1 : 1;
i = (array.length + i + incOrDec) % array.length;
}
}
const seq = f(array);
console.log(seq.next().value); // a
console.log(seq.next().value); // b
console.log(seq.next().value); // c
console.log(seq.next().value); // a
console.log(seq.next('prev').value); // c <-- expect 'c'
Если вы не встраиваете функциональность в генератор, вам придется явно сохранить результат предыдущей итерации в переменной, а затем проверить его.Там нет встроенного метода, как .prev
.
Я неопытный с генераторами, и если есть лучшая структура данных / метод для постепенного получения значений (предыдущий и следующий), яоткрыто для того, чтобы услышать об этих предложениях
Если у вас нет для работы с генератором, и ваша цель состоит в том, чтобы иметь возможность перебирать вперед и назад, тогда не,Если вы начинаете с генератора (например, с внешней функцией, которой вы не можете управлять), то вы можете использовать метод, аналогичный приведенному выше, для преобразования генератора в метод, который может перемещаться вперед и назад.В противном случае просто используйте простой массив, в который вы помещаете значения, и ищите индикаторы, например:
const array = ['a', 'b', 'c'];
function* f(array) {
let i = 0;
while (true) {
const incOrDec = (yield array[i]) === 'prev' ? -1 : 1;
i = (array.length + i + incOrDec) % array.length;
}
}
const cache = [];
const getValue = i => cache[i] || (cache[i] = /* put logic for retrieving value here */ array[i % array.length]);
console.log(getValue(0));
console.log(getValue(1));
console.log(getValue(2));
console.log(getValue(3));
console.log(getValue(4));
console.log(getValue(3));