Как сломать изнутри обратный вызов в цикле for - PullRequest
0 голосов
/ 27 сентября 2018

Если я bind функция find в javascript, я могу сделать следующее:

const _array = [4,10,6,5,20];

const loop = Array.prototype.find.bind(_array);
const r = loop(function (x) {
    return x === 6;
});

console.log(`Final result => ${r}`); // here prints: Final result => 6

Как вы можете видеть, в в связном loop функция Iиметь обратный вызов , возвращаемый find.Все работает и все нормально ...

Но, пытаясь смоделировать что-то подобное, я закончил с этим:

function loop(a,callback) {
    for(i=0;i<a.length;i++)
        callback(a[i]);
};

const r = loop([4,10,6,5,20], function (x) {
    console.log("x value", x);
    return x===6; // need to break the loop function and return to 'r' the 'x' value
});

console.log(`Final result => ${r}`); // here would print the value of x, that would be 6

и получаю:

x value 4
x value 10
x value 6
x value 5
x value 20
undefined

чтоозначает, что return x===6 внутри функции r работает неправильно, потому что for-loop продолжается до конца.

Итак, мой вопрос:

Как можно сломать функцию loop при x===6 и вернуть значение x?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Вы также можете написать find, используя рекурсию

const find = (f, [ x, ...xs ]) =>
  x === undefined
    ? null
  : f (x) === true
    ? x
  : find (f, xs)

console.log
  ( find
      ( x => x > 8
      , [ 5, 7, 9, 3, 1 ]
      )
      // 9
      
  , find
      ( x => x < 4
      , [ 5, 7, 9, 3, 1 ]
      )
      // 3
  )

Вместо назначения деструктурирования можно использовать индексный параметр

const find = (f, xs = [], i = 0) =>
  i >= xs.length
    ? null
  : f (xs[i]) === true
    ? xs[i]
  : find (f, xs, i + 1)

В обоих случаях итерация по массиву останавливается, как только fвозвращает true

0 голосов
/ 27 сентября 2018

Проверьте, какое значение возвращает обратный вызов, а затем решите, продолжать или нет:

function loop(a, callback) {
  for (let i = 0; i < a.length; i++) {
    const found = callback(a[i]);
    if (found) {
      return a[i];
    }
  }
}

const r = loop([4,10,6,5,20], function (x) {
  console.log("x value", x);
  return x===6;
});

console.log(`Final result => ${r}`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...