2015-12-08 2 views
2

функция содержит ниже написана на основе функции .reduce():Пытаясь понять синтаксис этой .contain функции()

_.reduce = function(collection, iterator, accumulator) { 
    each(collection,function(value){ 
    accumulator=iterator(accumulator,value); 

    }); 
    return accumulator 
    }; 

Im любопытное путать синтаксисом здесь, или это написано логически? почему мы сначала используем оператор if и возвращаем 'wasFound', прежде чем задавать значение === target? нет, если item === target is true, мы установили isFound в true?

 _.contains = function(collection, target) { 
     return _.reduce(collection, function(wasFound, item) { 
      if (wasFound) { 
      return true; 
      } 
      return item === target; 
     }, false); 
     }; 
+0

Он возвращает 'true' там, потому что первый arg указывает, нашел ли он совпадение ранее. Вы посмотрели документацию под названием «Подчеркивание»? (Или lodash, если это то, что вы используете.) – Robusto

ответ

1

В первый раз функция reduce делает матч (return item === target) он в дальнейшем будет возвращать верно для всех остальных пунктов, которые будут итерации. Нет причин проверять, соответствуют ли будущие значения цели, потому что нам остается только, если коллекция содержит цель как минимум 1 раз. Поэтому, если значение wasFound истинно, оно просто возвращает true.

0

Вы можете использовать его как это:

_.contains([1,2,3], 2); 
//=> true 

_.contains([1,2,3], 5); 
//=> false 

Она принимает список и элемент. Она устанавливает wasFound к false первоначально, а затем для каждого item в collection чеков: (1) если wasFound является true, то некоторые предыдущий item был идентичен target, поэтому установить wasFound к true, чтобы сохранить его, (2) в противном случае, установить wasFound на значение item === target.

+0

OP пытается понять '_.contains', поскольку использует соответствующую реализацию' _.reduce'. Использование встроенной функции 'reduce' идет вразрез с тем, что они пытаются понять. –

+0

@MikeC Спасибо. Я понял, что это неправильно. Исправленный. –