Подчеркнуть. js функция внутри функции - PullRequest
0 голосов
/ 02 марта 2020
  _.filter = function(collection, test) {
    var result = [];
    _.each(collection, function(value) {
      if(test(value)) {
        result.push(value);
      }
    })
    return result;
  };
  _.reject = function(collection, test) {
    var result = [];
    return _.filter(collection, function(value) {
      return !test(value);
    })
  };

Я немного озадачен тем, как это работает. У меня есть две функции подчеркивания. js, определенные здесь в одной и той же области видимости. Если я передаю тестовый массив случайных чисел, как работает _.filter в _.reject?

var isEven = function(num) { return num % 2 === 0; };
var odds = _.reject([1, 2, 3, 4, 5, 6], isEven);
expect(odds).to.eql([1, 3, 5]);

Например, я проверяю свои функции и получаю, что утверждение верно, но я не понимаю, как это работает

Ответы [ 2 ]

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

Например, если ваш массив чисел:

const nums = [1, 2, 3, 4, 5, 6]

и у вас есть функция isEven, которая принимает число и возвращает true, если оно четное, и false, если оно есть не четное (ie нечетное):

function isEven(num) {
  return num % 2 === 0;
}

Затем выполнение _.filter(arr, isEven) выполнит следующую логику c:

  • arr примет имя collection и isEven принимает имя test
  • Объявите массив с именем result.
  • L oop через каждое число в четном

    • Для каждого номера (value) проверьте, дает ли вызов test(value) результат true.
    • Если test(value) имеет значение true, то добавить число (value) в конец массива result.
    • Go к следующему номеру в массиве collection
  • возвращает массив result.

Итак, filter() выполняет функцию isEven для каждого числа в вашем массив, и если он возвращает true, он добавляется в новый массив (ie: он сохраняется).

_.reject() делает противоположное _.filter() - то есть он сохраняет все элементы, для которых функция обратного вызова возвращает false. Как вы знаете, _.filter() сохраняет значения, для которых он возвращает true, вы можете использовать _.filter(), отрицая значение логического значения, возвращаемого test(value). Таким образом, когда test(value) возвращает false, вы отрицаете его на true, заставляя метод _.filter() сохранить этот элемент. Если test(value) вернет true, то вы будете отрицать, что оно равно false, в результате чего метод фильтра отбрасывает это value.

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

Отклонение - это просто повторное использование некоторых логик c, которые выполняет фильтр. Это можно было бы легко записать так:

_.reject = function(collection, test) {
  var result = [];
  _.each(collection, function(value) {
    if(!test(value)) {
      result.push(value);
    }
  })
  return result;
};

Вы заметите, что единственная разница между фильтром и отклонением состоит в том, хотим ли мы сохранять элементы, когда тест верен или когда тест ложен.

// Creates the function reject
_.reject = function(collection, test) {
  var result = [];

  // Calls filter but hands in a custom callback.
  // Filter iterates each item in the list, and keeps it
  // if test(item) returns true (test is our custom flipResult).
  // Remember that reject does the opposite, it keeps it
  // if test(item) returns false (aka !true).
  return _.filter(collection, function flipResult(value) {

    // The user gave us a test method. We want to keep items
    // that return false when passed to test.
    // If we call _.filter(collection, test) we will get all
    // items that return true when passed to test, but thats not what we want
    // So instead of handing test in directly, we hand in our custom callback
    // The custom callback calls test and flips the result.
    // This means filter will keep all items that return false
    // because our custom callback is flipping the result !test
    return !test(value);
  })
};
...