TypeError:无法在对象中找到forEach函数

时间:2015-07-09 02:36:08

标签: javascript object foreach typeerror

我正在尝试创建用于检索XML数据的缓存。

我的问题是我得到一个错误“TypeError:找不到对象中的每个函数”

我不明白为什么我会得到错误,并且我从示例中复制了大部分内容。

错误发生在:

 priceIDs.forEach (function (row) {
 row.forEach ( function (cell) {
  if (typeof(cell) === 'number' ) {
    dirtyTypeIDs.push(cell);
  }
 });
 });

行“row.forEach(function(cell){”似乎是罪魁祸首。我将发布以下全部代码供人们帮助:)

function LoadPrices(priceIDs, systemID,cacheBuster){

if (typeof systemID == "undefined") {
systemID=30000142;
}

if (typeof priceIDs == "undefined") {
throw "need typeids";
}

if (typeof cacheBuster == "undefined") {
cacheBuster=1;
}

var prices = new Array();
var dirtyTypeIDs = new Array();
var cleanTypeIDs = new Array();

var url = "http://api.eve-central.com/api/marketstat?cacheBuster="+cacheBuster+"&usesystem="+systemID+"&typeid=";

priceIDs.forEach (function (row) {
row.forEach ( function (cell) {
  if (typeof(cell) === 'number' ) {
    dirtyTypeIDs.push(cell);
  }
});
});

cleanTypeIDs = dirtyTypeIDs.filter(function(v,i,a) {
return a.indexOf(v)===i;
});

var parameters = {method : "get",payload: ""};

var xmlFeed = UrlFetchApp.fetch(url+cleanTypeIDs.join("&typeid="),parameters).getContent();
var xml = XmlService.parse(xmlFeed);  

if(xml)
{
var rows=xml.getRootElement().getChild("marketstat").getChildren("type");
for(var i = 0; i< rows.length; i++) {
  var price = [rows[i].getAttribute("id").getValue(),
  rows[i].getChild("sell").getChild("volume").getValue(),
  rows[i].getChild("sell").getChild("avg").getValue(),
  rows[i].getChild("sell").getChild("max").getValue(),
  rows[i].getChild("sell").getChild("min").getValue(),
  rows[i].getChild("sell").getChild("stddev").getValue(),
  rows[i].getChild("sell").getChild("median").getValue(),
  rows[i].getChild("sell").getChild("percentile").getValue(),
  rows[i].getChild("buy").getChild("min").getValue(),
  rows[i].getChild("buy").getChild("avg").getValue(),
  rows[i].getChild("buy").getChild("max").getValue(),
  rows[i].getChild("buy").getChild("min").getValue(),
  rows[i].getChild("buy").getChild("stddev").getValue(),
  rows[i].getChild("buy").getChild("median").getValue(),
  rows[i].getChild("buy").getChild("percentile").getValue(),
];
prices.push(price);
}
};
}

能帮助我理解错误并纠正错误吗?

2 个答案:

答案 0 :(得分:1)

简答:

您的row变量实际上是一个对象,因此您无法使用forEach。您可以使用此代码正确迭代row

for (var column in row) {
    if (row.hasOwnProperty(column)) {
        var cell = row[column];

        if (typeof cell == "number") {
            dirtyTypeIDs.push(cell);
        }
    }
}

更多信息here

答案很长:

当您尝试访问Object的属性但是该属性缺失时会发生TypeError

在第一种情况下,您要求priceIDs数组)调用其forEach函数。它快乐地完成了这项工作,为您提供所需的结果(row)。

但是,在第二种情况下,您要求row对象)调用其forEach函数。 row不知道任何名为forEach的内容,因此会立即死亡。

要迭代Object的属性,您需要使用for...in循环。上面的代码将使用row,迭代相应的属性,并根据您提供的逻辑将其值推送到dirtyTypeIDs。链接下面链接的问题解答了为什么hasOwnProperty检查是必要的。

答案 1 :(得分:0)

函数“forEach”是Array对象的函数。您还可以找到与https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

的浏览器兼容性