正确使用array.prototype.forEach()

时间:2014-11-13 20:51:16

标签: javascript prototype

我很乐意使用一种功能来删除.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的原型方面来做这件事。

2 个答案:

答案 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));