Company logo
  • Empleos
  • Bootcamp
  • Acerca de nosotros
  • Para profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
    • Bootcamp
  • Para empresas
    • Inicio
    • Nuestro proceso
    • Planes
    • Pruebas
    • Nómina
    • Blog
    • Comercial
    • Calculadora

0

57
Vistas
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.

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!

7 months ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Here is my generator solution & closure solution

// 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())

7 months ago · Juan Pablo Isaza Denunciar

0

Simply use an iterator function.

function* getCurrentValue(arr, count) {
  for (let item of arr) {
    for (let j = 0; j < count; j++) {
      yield item;
    }
  }
}

for (let value of getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3)) 
{
  console.log(value);
}

7 months ago · Juan Pablo Isaza Denunciar

0

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:

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; }

7 months ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos