我很乐意使用一种功能来删除.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 = [];
做一些新的事情,甚至可能用JS的原型方面来做这件事。
答案 0 :(得分:2)
我认为最好的办法是使用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;
});
答案 1 :(得分:1)
首先,正如评论中所述,请在此处使用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));