使用_.filter重新创建Underscore.js _.reject

时间:2014-05-08 14:05:24

标签: javascript

我正在开发一个项目,我正在重新创建Underscore.js中包含的许多基本功能。我已经使用_.each()的实现成功编写了_.filter()函数(两者都在下面)。

此外,我已经能够使用" easy"来编写_.reject()函数。出路(简单地复制/粘贴_.filter()代码并在适当的位置添加!)但是对于学习体验,我希望开发一个使用实际调用_.filter()的替代实现。

我已经看过问题和回复,显示如何使用另一个Underscore函数_.negate(),但我还没有在项目中实现此功能,所以我的问题是,是有一种方法来创建_.reject()使用_.filter()函数调用而不使用_.negate()吗?

_滤波器:

_.filter = function(collection, test) {
  var results = [];

  _.each(collection, function(itemTested) {
    if (test(itemTested)) {
      results.push(itemTested);
    }
  });

  return results;
};

_各:

_.each = function(collection, iterator) {
  if(Array.isArray(collection)) {
    for(var i = 0; i < collection.length; i++) {
      iterator(collection[i], i, collection);
    }
  }

  else {
    for(var property in collection) {
      iterator(collection[property], property, collection);
    }
  }
};

当前版本的_.reject:

_.reject = function(collection, test) {
  var results = [];

  _.each(collection, function(itemTested) {
    if (!test(itemTested)) {
      results.push(itemTested);
    }
  });

  return results;
};

2 个答案:

答案 0 :(得分:3)

使用过滤器拒绝功能:

var _ = {};

_.reject = function(col, fn) {
  return col.filter(function(v) {
    return !fn(v);
  });
}

// or using your _.filter function
_.reject = function(col, fn) {
  return _.filter(col, function(v) {
    return !fn(v);
  });
}

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

console.log(odd); // [1,3,5]

JS Bin示例

<强> http://jsbin.com/juyos/1/edit

答案 1 :(得分:1)

好吧,即使你不是打电话 _.negate,你仍然会知道它会做什么:

_.reject = function(collection, test) {
  return _.filter(collection, function(el, i, collection) {
    return !test(el, i, collection);
  });
};