[英]How to return the same value n amount of times from a closure function call?
What I would like to do is have a closure return the same value n
amount of times.我想做的是让闭包返回相同的值
n
次。
let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3);
I should then get:然后我应该得到:
value() // returns 0
value() // returns 0
value() // returns 0
value() // returns 315
value() // returns 315
value() // returns 315
value() // returns 270
value() // returns 270
value() // returns 270
This is what I tried!这是我试过的!
function getCurrentValue(values, num) {
let index = -1;
let l = values.length;
function increment() {
++index;
if (index < l) {
return values[index]
} else {
index = -1;
++index;
return values[index]
}
}
if (num) {
for (var i = 0; i < num; i++){
return increment
}
}
return increment;
}
Any help would be appreciated!任何帮助,将不胜感激!
Here is my generator
solution & closure solution这是我的
generator
解决方案和关闭解决方案
// generator solution function* getCurrentValueIter(iter, times) { for (let i = 0; i < iter.length * times; i++) { const cur = Math.floor(i / times); yield iter[cur] } } console.log('generate') const valueIter = getCurrentValueIter([0, 1], 2) for (let value of valueIter) { console.log(value) } // you can also use valueIter manually // console.log(valueIter.next().value) // closure solution function getCurrentValue(iter, times) { let i = 0 function value() { while (i < iter.length * times) { const cur = Math.floor(i / times); i += 1 return iter[cur] } } return value } const value = getCurrentValue([0, 1], 2) console.log('closure', value()) console.log(value()) console.log(value()) console.log(value())
Using just a closure - keep track of the index and the number of repeats outside the returned function, so the values persist through calls:仅使用闭包 - 跟踪索引和返回函数之外的重复次数,因此值通过调用保持:
function getCurrentValue(arr, n) { let index = 0; let repeat = 0; return function() { if (repeat < n) { repeat++; } else { repeat = 1; index++; } return arr[index]; } } let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3); console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }
The if
/ else
section can be shortened by using %
to increase the repeat
value and cap it to the maximum: if
/ else
部分可以通过使用%
来缩短repeat
值并将其限制为最大值:
function getCurrentValue(arr, n) { let index = -1; let repeat = -1; return function() { repeat = (repeat + 1) % n; if (repeat === 0) index++; return arr[index]; } } let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3); console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }
In Javascript:在 Javascript 中:
const values = [0, 315, 270, 225, 180, 135, 90];
const rNum = 3;
const getCurrentValue = (values, num) => {
if (num <= 0) {
return console.log("Repeater is invalid");
} else {
values.map((number) => {
let repeatingCount = 0;
while (repeatingCount != num) {
console.log(number);
repeatingCount++;
}
})
}
}
getCurrentValue(values, rNum);
const value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3); function getCurrentValue(arr = [], n = 0) { // Return if the array is empty or `n` is 0 if (!arr.length || !n) return; let index = 0; let count = 0; return function () { // Have we reached the end of the array? if (index < arr.length) { // No? Check to see if our count is less than `n` // increment it if it is, and log the number if (count < n) { ++count; console.log(arr[index]); // Otherwise increase the array index // and set `count` to zero } else { ++index; count = 0; } } } } value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value(),value();
If I understood well this is what you want如果我理解得很好,这就是你想要的
let res = [];
function getCurrentValue(arr, x) {
res = [];
for (val of arr) {
for (let i = 0; i < x; i++) {
res.push(val);
}
}
}
getCurrentValue([0, 42, 4], 3)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.