【问题标题】:JavaScript function not working as intendedJavaScript 函数未按预期工作
【发布时间】:2015-04-11 07:18:48
【问题描述】:

我一直在解决一个问题,需要一些帮助!

我在下面创建了自己的每个函数:

var myArray = [1,2,3,4,5]; // this will be running through the collection parameter

var each = function (collection, callback) {
 if (Array.isArray(collection)) {
    for (i=0; i<collection.length; i++) {
    callback(collection[i]);
        };
} else {
  for (var property in collection){
    callback(collection[property]);
  }
}
};

我还在下面创建了自己的过滤器功能:

var filter = function(collection, predicate) {
var newArray= [];
  if (each(collection, predicate)) {
    newArray.push(collection[property]);
  };
return newArray;
};


var test = function (item) {
return item > 2;
}; // this will be running through the predicate parameter

filter(myArray, test);

我想要做的是利用过滤器函数中的每个函数,而不更改每个函数或测试函数,并且只更改过滤器函数。最后一行代码旨在返回的是 myArray 中在谓词参数下最终为真的每个元素 - 在本例中为测试函数。所以,结果应该是[3,4,5]。但是,我只是让数组打印为空。我知道错误在哪里——我相信它就在这里:

if (each(collection, predicate))

这行代码试图做的是使用 each 函数,使用 predicate 函数迭代集合中的每个项目,如果该特定项目在 predicate 下的计算结果为 true,则以下行会将元素推送到 newArray .

希望这是有道理的!

【问题讨论】:

  • 别忘了用var声明你的局部变量!!!

标签: javascript higher-order-functions


【解决方案1】:

你会想做这样的事情:

var filter = function(collection, predicate) {
  var array = [];
  each(collection, function(item) {
    if(predicate(item))
      array.push(item);
  });
  return array;
};

每个的第二个元素是回调

【讨论】:

  • OP 没有使用 Underscore 或 Lodash。
  • @Pointy 哎呀,那个下划线是个坏习惯,我把它去掉了。
【解决方案2】:

您的 filter 函数需要将谓词包装在一个单独的函数中,以便它可以构建其返回值:

var filter = function(collection, predicate) {
  var newArray= [];
  each(collection, function(element) {
    if (predicate(element)) newArray.push(element);
  });
  return newArray;
};

现在你的回调传递到你的each()函数使用传入的测试函数来检查集合的每个元素,但它可以使用该结果来确定元素是否应该被添加到结果中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2022-01-25
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多