对象不支持属性或方法“forEach” IE 11。

4

我有以下代码片段

data.forEach(function (row) {
var dataRow = [];

columns.forEach(function (column) {

dataRow.push(row[column].toString());
})

我遇到了一个错误,data.forEach(function (row) { 。这种情况应该使用什么替代方法?如何解决这个问题?


1
否则,您也可以使用Polyfill。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach - brk
1
@brk 这个 polyfill 是为 Array#forEach 设计的。那个被复制目标所说的是 NodeList#forEach。RAM,你能确认你尝试使用的确实是这个 NodeList#forEach 吗? - Kaiido
nodelist#forEach polyfill - 我怀疑 OP 说的不是 NodeList。 - Jaromanda X
是的,听起来更像是 data 不是它应该的样子。我重新打开了 (save-link-to-prev-dupe-target)。但请注意,就目前而言,这个问题仍然应该关闭,因为它缺少一些信息和调试步骤,你应该在你的一侧进行(比如,在调用其不存在的 forEach 方法之前,data 是什么?) - Kaiido
当数据为对象时,您不能通过forEach循环。它应该在数组上运行。为了遍历对象,您可以尝试:for (var key in data) { if (data.hasOwnProperty(key)) { console.log(key + " -> " + data[key]); // 这里您将获得键和值 } } - Ankit
2个回答

12

对于使用document.querySelectorAll('..').forEach()并在IE 11中出现“forEach不是函数”的问题的任何人,我在Reddit上发现了一个技巧,可以很好地解决这个问题:

针对这个问题,可以使用以下代码作为hack来解决:

if (window.NodeList && !NodeList.prototype.forEach) {
    NodeList.prototype.forEach = function (callback, thisArg) {
        thisArg = thisArg || window;
        for (var i = 0; i < this.length; i++) {
            callback.call(thisArg, this[i], i, this);
        }
    };
}
if (typeof NodeList.prototype.forEach !== 'function')  {
    NodeList.prototype.forEach = Array.prototype.forEach;
}

这段代码完美运行,只需3行代码,而不需要使用 polyfill。

@JoeTaras 在他的答案中暗示了这一点(是的,IE自IE9以来就有 Array.forEach),但我仍然认为我的答案有价值,并将帮助其他用户。


1
这个时间点发布非常完美!非常感谢!不知道为什么会有损坏,但这是宝贵的! - klewis

2

IE11 知道 forEach 语句(从 IE 9.0 开始兼容,详情请见这里),但是如果您想要,可以使用 for 语句代替 forEach,如下所示:

我编辑了我的答案,在数据对象上添加了一个检查,以确定其是否为数组。

if (data != null && Array.isArray(data)) {
    var dataRow = [];
    for (var i = 0; i < data.length; i++) {
        var row = data[i];
        for (var j = 0; j < columns.length; i++) {
            var column = columns[i];

            dataRow.push(row[column].toString());
        }
    }
}

那是在假设data变量持有一个索引对象,这是一个很强的假设,因为它没有*#forEach*方法。+ 在for循环中的var foo=bar... - Kaiido
@Kaiido:你好,是的,我基于问题。但现在我编辑了我的问题。 - Joe Taras
1
啊,我们至少知道data不是一个数组。幸运的是,IE11支持Array#forEach。 - Kaiido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接