为什么我得到 ..is not a function?

why do I get ..is not a function?

我正在尝试创建 angular 服务,但出现错误。这是服务:

var app = angular.module('plunker', []);

// Filter Service that returns records with crdamt positive:
app.factory('FilterService', function() {
  return function(d) {
    var filteredData = [];
    console.log(d);
    d.forEach(function(item) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData;
  }
});

然而在我的单元测试中我们得到:

  it('should return transactions where credit is positive', function() {
    var jsonData = {
      "transactions": [{
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      }, {
        "date": "1/1/2002",
        "desc": "Transaction",
        "cramt": 110,
        "dbamt": 10
      }]
    };

    var filteredRecords = FilterService(jsonData);
    expect(filteredRecords).toEqual({
      "date": "1/1/2000",
      "desc": "Purchase",
      "cramt": 50,
      "dbamt": 0
    });
  });

为什么会出现错误:

TypeError: d.forEach is not a function

plunkr:http://plnkr.co/edit/jdg0wEj1zSDTbqojBAoc?p=preview

试试吧。我期待变量 d 作为数组。

angular.forEach(d, function(item){
    if (item.cramt > 0) {
        filteredData.push(item);
    }
});

您没有为 angular js 的 forEach 函数使用正确的语法。请参考此 angular.forEach 指令

forEach 方法在 arrays 上可用。 查看您的 jsonData,您可以这样做:

app.factory('FilterService', function() {
  return function(data) {
    var filteredData = [];
    console.log(data.transactions);
    data.transactions.forEach(function(item) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData;
  }
});

P.S: 请阅读错误信息。它清楚地表明 d.forEach 不是函数。这就像尝试定义一个对象:

var person = {
  'name':'Paul'
};

并尝试访问 person.height()height 不是 person 对象的 属性,您正在尝试访问 undefined property as a function.

您的测试试图过滤整个对象而不是事务数组。

var filteredRecords = FilterService(jsonData);
expect(filteredRecords).toEqual({
  "date": "1/1/2000",
  "desc": "Purchase",
  "cramt": 50,
  "dbamt": 0
});

应该是

var filteredRecords = FilterService(jsonData.transactions);
expect(filteredRecords).toEqual([{
  "date": "1/1/2000",
  "desc": "Purchase",
  "cramt": 50,
  "dbamt": 0
}]);

请查看更新后的 plnkr。 forEach 仅用于数组,而您的 'd' returns 是一个对象。

以下是对 plnkr 的link:

``http://plnkr.co/edit/o65e0xEsBiW0jpawhGse?p=preview

你可以这样定义过滤器。

app.factory('FilterService', function() {

  return function(d) {
    var filteredData = [];
    var boolDataISFound = false;
     console.log(d.transactions)
    d.transactions.forEach(function(item,index) 
    {
      if (item.cramt > 0) {
          filteredData.push(item);
      }
    });
    return filteredData[0];
  }

});

这是期望值

it('should return transactions where credit is positive', function() {

    var jsonData = [{
      "transactions": [{
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      }, {
        "date": "1/1/2002",
        "desc": "Transaction",
        "cramt": 110,
        "dbamt": 10
      }]
    }];

    var filteredRecords = FilterService(jsonData[0]);
     expect(filteredRecords).toEqual({
        "date": "1/1/2000",
        "desc": "Purchase",
        "cramt": 50,
        "dbamt": 0
      } );


  });

这是Plunker