繁体   English   中英

正确使用array.prototype.forEach()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM