我正在尝试创建用于检索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);
}
};
}
能帮助我理解错误并纠正错误吗?
答案 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
的浏览器兼容性