我正在开发一个项目,我正在重新创建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;
};
答案 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示例
答案 1 :(得分:1)
好吧,即使你不是打电话 _.negate
,你仍然会知道它会做什么:
_.reject = function(collection, test) {
return _.filter(collection, function(el, i, collection) {
return !test(el, i, collection);
});
};