Команда возврата для функций обратного вызова - PullRequest
0 голосов
/ 23 марта 2020
function twoSum(numbers, target) {
  var result = [];

  numbers.forEach(function(value, index) {
    return numbers.forEach(function(value2, index2) {
      if (value + value2 === target) {
        result.push(index, index2);
        return result;
      }
    }) 
  })
  return result;
}

twoSum([1, 2, 3], 4);
//Output - [ 0, 2, 1, 1, 2, 0 ]

Привет. Я работаю над определенной проблемой кодовых войн и, похоже, неправильно понимаю использование return для функций обратного вызова. В этой конкретной задаче я просто хочу найти первые две суммы чисел, которые равны цели, и pu sh этих значений индекса в результате. Я не хочу продолжать итерацию своей функции после этого - то есть я хочу только первую найденную пару. Мой текущий вывод дает мне все значения индекса для целевой суммы. Не только первые 2. Кажется, я неправильно использую свои команды возврата. В настоящее время я считаю, что return result возвращает значение для моего вложенного обратного вызова параметров (value2, index2). Этот результат затем возвращается к моей внешней функции (value,index). Почему мой l oop не прекращается после этого return?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Не заканчивается, потому что .forEach не может быть прекращено досрочно. forEach не обращает никакого внимания на возвращаемые вами значения. Если вы хотите прекратить досрочно, вам нужно использовать другой подход.

Если вы хотите придерживаться методов массива, есть .some и .every. Первый продолжается до тех пор, пока запуск вашей функции не возвращает true, а второй продолжается до тех пор, пока запуск вашей функции не возвращает false. Они предназначены для выполнения составных ИЛИ и составных И с каждым элементом массива, но они также могут использоваться для вашего случая.

numbers.some(function(value, index) {
  return numbers.some(function(value2, index2) {
    if (value + value2 === target) {
      result.push(index, index2);
      return true;
    }
    return false;
  }) 
})

Или вы можете использовать стандарт для l oop, с ключевое слово break, когда вы хотите остановить l oop.

0 голосов
/ 23 марта 2020

Помимо неработающего оператора return для внешней функции, вам нужно использовать другой подход, который использует только один l oop и объект для хранения индекса найденного значения.

function twoSum(numbers, target) {
    var indices = {};

    for (let i = 0; i < numbers.length; i++) {
        const number = numbers[i];
        if (number in indices) return [indices[number], i];
        indices[target - number] = i;
    }
}

console.log(twoSum([1, 2, 3], 4));
...