[英]Utilizing array.prototype.forEach() correctly
我很想利用一个从.forEach()
删除项目的函数。 我目前使用的一个例子如下:
// return items even if no authentication is present
return ArticleModel.find(function (err, articles) {
var regularArray = [];
function stripOutPremium(element, index, array) {
if (element.is_premium === true) {
var elementDescAdjustment = element.description;
element.description = 'Premium content! ' + elementDescAdjustment.substr(0,15) + '...';
regularArray.push(element);
} else {
regularArray.push(element);
}
}
articles.forEach(stripOutPremium);
return res.send(regularArray);
但是,这个函数stripOutPremium()
将在许多不同的地方使用,对于这个特定的应用程序(显示的是一个单一的Express App Route)。 如何在此返回语句之外重写此函数,以便我可以在我的应用程序中的任何路径上使用它? 我知道它涉及使用var regularArray = [];
做一些新的事情var regularArray = [];
甚至可能是JS的原型方面来做到这一点。
我认为你最好的选择是使用Array.map()
,并返回一个新版本的数组:
articles.map(function(element, index, array) {
if (element.is_premium === true) {
var elementDescAdjustment = element.description;
element.description = 'Premium content! ' + elementDescAdjustment.substr(0,15) + '...';
}
return element;
});
首先,如评论中所述,在此处使用filter
而不是forEach
:
function stripOutPremium(element, index, array) {
if (element.is_premium === true) {
var elementDescAdjustment = element.description;
element.description = 'Premium content! ' + elementDescAdjustment.substr(0,15) + '...';
}
return true;
}
return articles.filter(stripOutPremium);
filter
构建一个新数组,因此您不需要自己创建一个数组。 通过在回调中return true
,可以包含原始数组的每个元素,但是可以在处理时有条件地改变每个元素。 如果您将来需要排除任何元素,则可以为该元素return false
。 (你也可以用map
做同样的事情,但是return element
而不是return true
。)
要回答你的实际问题:如果你想使用一般函数作为回调但让它改变一些特定的本地数组,你可以编写一个返回另一个函数的函数。 外部函数将数组作为参数,并返回使用该数组的新创建的内部函数:
function generateStriptOutPremiumForArray(someArray) {
return function stripOutPremium(element, index, array) {
if (element.is_premium === true) {
var elementDescAdjustment = element.description;
element.description = 'Premium content! ' + elementDescAdjustment.substr(0,15) + '...';
someArray.push(element);
} else {
someArray.push(element);
}
}
}
这里,outer函数返回一个新函数,该函数在其作用域链中具有外部函数的someArray
变量。 由于您将regularArray
作为外部函数的someArray
参数传递,因此生成的内部函数可以访问本地regularArray
。
称之为:
var regularArray = [];
var generatedCallbackForThisRegularArray = generateStripOutPremiumForArray(regularArray);
articles.forEach(generatedCallbackForThisRegularArray);
// or just: articles.forEach(generateStripOutPremium(regularArray));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.