【问题标题】:TypeError: Cannot find function forEach in objectTypeError:在对象中找不到函数 forEach
【发布时间】:2015-09-27 05:15:03
【问题描述】:

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

我的问题是我收到一个错误“TypeError: Cannot find function forEach in object”

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

错误发生在:

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

“row.forEach(函数(单元格){”行似乎是罪魁祸首。我将在下面发布整个代码以供人们帮助:)

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);
}
};
}

谁能帮我理解错误并纠正它?

【问题讨论】:

标签: javascript object foreach typeerror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    简答:

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

    for (var column in row) {
        if (row.hasOwnProperty(column)) {
            var cell = row[column];
    
            if (typeof cell == "number") {
                dirtyTypeIDs.push(cell);
            }
        }
    }
    

    更多信息here


    长答案:

    TypeError 是当您尝试访问 Object 的属性但该属性丢失时发生的事情。

    在第一种情况下,您要求priceIDs(一个数组)调用它的forEach 函数。它很高兴地做到了这一点,为您提供所需的结果 (row)。

    但是,在第二种情况下,您要求row(一个对象)调用其forEach 函数。 row 不知道任何叫做 forEach 的东西,所以它会立即死亡。

    要迭代对象的属性,您需要使用for...in 循环。上面的代码将采用row,迭代适当的属性,并根据您提供的逻辑将它们的值推送到dirtyTypeIDs。代码下方链接的问题回答了为什么需要进行hasOwnProperty 检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多